Datos que encapsulan para un buen diseño y mantenimiento en rápida
Considere el concepto de encapsulación, un concepto importante de la programación objeto # 8208 orientado a. La idea detrás de la encapsulación es que los objetos deben ser opacos: Usted no debe ser capaz de decir lo que hay dentro de datos de una aplicación, lo que la funcionalidad que contiene, o lo que las operaciones que realiza. Hacer esto hace que sus objetos flexibles y reutilizables.
Este concepto ha demostrado su valor a lo largo de los años. El original # 173-arquitectura del Objetivo # 8208-C consistió en marcos de objetos (aunque la palabra " marco " no se utilizó al principio). Los objetos eran opacas para que los ingenieros de software no podían mirar dentro de ellos (o, al menos, no se supone que). Un objeto con nombre (por ejemplo) miObjeto, se supone que tienen algunos datos - tal vez llamada datos - y estos datos sí era off # 8208 de límites a los desarrolladores.
En lugar de acceder directamente a los datos, los desarrolladores aprendieron a enviar un mensaje a miObjeto para obtener sus datos. Por convención, el mensaje sería nombrado ObjectData y causaría miObjeto para devolver los datos de miObjeto.
Si se mira más de cerca a este diseño, miObjeto es la de clases ObjectData es el nombre de la función o método que sirve como una getter. Otro método llamado (por defecto) setObjectData es el setter. El colocador tiene un solo parámetro (normalmente llamada (newObjectData).
Usted haría único acceso ObjectData utilizando cualquiera ObjectData conseguirlo o setObjectData para establecer o actualizarlo. Una consecuencia interesante y útil de este diseño es que ObjectData (los datos almacenados por miObjeto) No tiene por qué existir.
Los descriptores de acceso (ObjectData y setObjectData) Puede trabajar con datos dinámicos que pueden en realidad nunca se almacena. Con encapsulación como esto, nunca tendría que saber si los datos se almacenan o se calcula sobre la marcha. Todo lo que necesitas saber es que miObjeto obtiene los datos para usted con ObjectData y toma de datos de usted con setObjectData.
Mientras tanto accessors trabajan, ya sea calculado sobre la marcha, almacenada en una base de datos, o incluso almacenada en la luna no importa: miObjeto encapsulados sus datos.
Otros idiomas se permitirá acceder a los datos directamente utilizando una sintaxis como myObject.objectData, pero debido a la referencia real a los datos en este caso sería myObject.objectData () - un método o función de llamada (nota entre paréntesis al final) - encapsulación es completa.
La sintaxis hipotética muestra en los párrafos anteriores es una versión genérica de la sintaxis moderna o " dot sintaxis " utilizado en el Objetivo # 8208-C de la década de 1990 en adelante. Usando el estilo original del Objetivo # 8208-C (a veces llamado el formato de mensaje) La manera de enviar el ObjectData mensaje a miObjeto sería con código como el siguiente: [miObjeto ObjectData].
Creación y preservación de encapsulación se convirtió en una parte importante de # 8208-C desarrollo Objetivo. Es cierto que la encapsulación conserva muchas de las características de gran alcance del objetivo # 8208-C y hace que la reutilización de código mucho más fácil, pero en algunos casos, la encapsulación puede ser un poco más complicado para escribir y, a veces toma más recursos para ejecutar.
Por lo tanto, aunque la estructura no es especialmente complicado, almacenar, recuperar, y el establecimiento de valor de una variable requiere tres elementos.
Los componentes de esta estructura son:
una variable real o código para calcular ella (esto es invisible para el usuario)
un método getter para obtener el valor de la variable (esto es visible para usted)
un método pionero para establecer el valor de la variable (esto es visible para usted)
En Objetivo # 8208-C 2 (lanzado en 2007), propiedades con nombre se introdujeron. Proporcionan una forma de simplificar esta estructura, pero son totalmente compatible con él. Una propiedad con nombre tiene un formato como este:
property (no atómica fuerte) Identificación detailItem- @ propiedad (débil, no atómica) IBOutletUILabel * detailDescriptionLabel-
La propiedad comienza con la directiva del compilador property seguido por los atributos de memoria y uso de paréntesis, como fuerte, débil, solo lectura, y no atómica - los significados específicos no importan en este momento.
A continuación los atributos entre paréntesis son del tipo de la propiedad y luego su nombre. Para los tipos de objetos, se utiliza un puntero. El tipo de clase Identificación no es un puntero. Una vez más, los detalles no importan en este momento.
Lo que importa es que con una declaración de propiedad, el compilador es capaz de declarar de forma automática y crear un variable de respaldo, que es la propia variable donde se almacenan los datos. También es capaz de crear un getter y un setter utilizando las convenciones descritas anteriormente (el getter es el nombre de la variable y el colocador es setMyVariable).
Varios convenios entran en juego aquí. Los nombres de variables comienzan con una letra minúscula. Si el nombre de la variable consta de varias palabras, las palabras después de la primera comienzan con letras mayúsculas (esto se llama el caso de Carmel). Métodos y funciones comienzan con clases letras- minúsculas comienzan con letras mayúsculas. Las convenciones se reúnen en el nombre de un pionero.
Considere una variable llamada myVariable cuyo pionero es llamado setMyVariable. Esto se ajusta a la convención de que los métodos comienzan con letras minúsculas, y también se ajusta a la convención camelCase. Sin embargo, debido a que el encuentro de estas dos convenciones podría sugerir el nombre setmyVariable, camelCase anula otras convenciones.
Por lo tanto, las propiedades con nombre reducen la cantidad de mecanografía necesaria para utilizar las propiedades haciendo que el compilador de hacer la obra de la creación de los descriptores de acceso get y set y de crear la variable de respaldo.
En algunos casos, los desarrolladores han necesitado más control sobre las cosas. Los dos casos más comunes de este fueron los siguientes:
Cuando un desarrollador necesita una variable respaldo que tener un cierto nombre y tiene que ser capaz de acceder a él directamente.
Cuando el armador o el comprador tiene que hacer algo más que establecer o obtener el valor de una variable.
Aquí es donde la complejidad empieza a entrar.
El sintetizador automatizado propiedad sintetiza una variable respaldo con el nombre de la propiedad precedido por un guión bajo. Por lo tanto, el valor predeterminado respaldo variable para mi propiedad es _mi propiedad. (Puede establecer esto como una opción en la declaración de propiedad.)
También puede escribir sus propios descriptores de acceso. Es común tener que realizar tareas adicionales más allá de su papel de descriptor de acceso simples. Una de las más comunes de estas tareas es el establecimiento de una conexión de base de datos para que un comprador puede obtener un valor previamente almacenado para su propiedad.
Hay muchas otras variaciones de esta estructura (incluyendo propiedades que no tienen las variables de respaldo, pero se basan simplemente en un captador para calcular o recuperar un valor en función de las necesidades 8208 #). Y, para completar esta parte de la imagen, se puede mezclar y combinar las propiedades con las variables tradicionales (variables de desnudos no son parte de una propiedad declarada).
Muchos de los argumentos en contra de la utilización de las propiedades con nombre (y han sido amargo) se centran en el hecho de que el acceso a un valor propiedades con nombre en la variable de respaldo requiere más recursos de la máquina que sólo acceder a una posición de memoria. Con las computadoras de hoy en día - incluso en los dispositivos móviles - esto puede parecer como una reacción extrema, pero ha sido común en algunos círculos.
Esto, entonces, es el mundo de las propiedades y las variables que se ocupa de Swift. Si todas sus complejidades y combinaciones son necesarios vale la pena discutir: Todos han encontrado usos en aplicaciones e incluso en los marcos de Apple que componen Cocoa y Cocoa Touch.
Hay otra capa de complejidad con respecto a las declaraciones de # 173-propiedades y variables. La mayoría de las declaraciones en las clases de Objetivo # código 8208-C se colocan en un archivo de cabecera en el interface sección. (Por convención, este archivo se denomina con un .h después de que el nombre de la clase.)
Bastante recientemente (a finales de la década de 2000) se convirtió en un lugar común para agregar un segundo interface sección en el formato de una extensión de la clase en el cuerpo principal del archivo de clase (el archivo con el .m extensión). Declaraciones en el archivo de cabecera se pueden agrupar en secciones con diferentes acceso - público, privado, y protegido. público y privado las interfaces son sólo eso. protegido elementos de la interfaz son visibles para la clase en sí y para cualquiera de sus subclases.
Por último, dentro del archivo principal (el .m archivo de extensión), puede acceder a la variable de copias de seguridad mediante el uso de su nombre, como en _myBackingVariable. Esto evita el uso de la getter y ahorra unos cuantos ciclos de la máquina. También puede lado # 8208 paso cualquier # 173-procesamiento adicional que el comprador hace- esta convención puede ser muy útil.
Este es el trasfondo de propiedades y variables en el Objetivo # 8208-C y ahora en Swift.