Encapsulando dados para um bom design e manutenção em rápida

Considere o conceito de encapsulamento

, um conceito importante da programação orientada a objeto. A idéia por trás de encapsulamento é que os objetos devem ser opaco: Você não deve ser capaz de dizer o que está dentro de dados de um aplicativo, o que funcionalidade que contém, ou o que as operações que realiza. Fazendo isso faz com que seus objetos flexível e reutilizável.

Este conceito tem provado o seu valor ao longo dos anos. A arquitetura original do Objective-C consistiu de quadros de objetos (embora a palavra “estrutura” não foi usado no começo). Os objetos eram opacas para que os engenheiros de software não podia olhar dentro deles (ou, pelo menos, eles não deveriam). Um objeto chamado (digamos) myObject, foi assumida para ter alguns dados - talvez chamado dados - e esses dados em si estava fora dos limites para os desenvolvedores.

Em vez de acessar os dados diretamente, os desenvolvedores aprenderam a enviar uma mensagem para myObject para obter os seus dados. Por convenção, a mensagem seria nomeado objectData e causaria myObject para retornar os dados de myObject.

Se você olhar mais de perto este projeto, myObject é a aula objectData é o nome da função ou método que serve como um getter. Outro método chamado (por padrão) setObjectData é o montador. O setter usa um único parâmetro (normalmente chamado (newObjectData).

Se fosse só o acesso objectData usando objectData para obtê-lo ou setObjectData para definir ou atualizá-lo. Uma consequência interessante e útil deste projeto é que objectData (os dados armazenados pela myObject) Não precisa existir.

Os assessores (objectData e setObjectData) Pode trabalhar com dados dinâmica que nunca pode realmente ser armazenados. Com encapsulamento como este, você nunca precisa de saber se deve ou não os dados são armazenados ou calculado na mosca. Tudo que você precisa saber é que myObject obtém dados para você com objectData e leva dados de você com setObjectData.

Enquanto ambos os acessores de trabalhar, seja calculado na mosca, armazenada em um banco de dados, ou até mesmo armazenado na lua não importa: myObject encapsula seus dados.

Video: 5 dicas para construir seu portfólio - Amarelo Criativo | S02-E16

Outras línguas que lhe permitem acessar os dados diretamente usando uma sintaxe como myObject.objectData, mas porque a referência real aos dados, neste caso, seria myObject.objectData () - um método ou chamada de função (note os parênteses no final) - encapsulamento é completo.

A sintaxe hipotético mostrado nos parágrafos anteriores é uma versão genérica da sintaxe moderna ou “sintaxe de ponto” utilizado em Objective-C a partir do final dos anos 1990 em diante. Usando o estilo original do Objective-C (às vezes chamado de formato de mensagem) A maneira de enviar o objectData mensagem para myObject seria com um código como este: [MeuObjeto objectData].

Criando e preservando encapsulamento tornou-se uma parte importante do desenvolvimento Objective-C. É verdade que o encapsulamento preserva muitas das características poderosas de Objective-C e faz reutilização de código muito mais fácil, mas em alguns casos, o encapsulamento pode ser um pouco mais complicado de escrever e às vezes leva mais recursos para executar.

Assim, embora a estrutura não é particularmente complicado, armazenamento, recuperação e definindo o valor de uma variável requer três elementos.

Os componentes desta estrutura são:

  • uma variável ou código real para calculá-lo (isto é tudo invisível para você)

  • um método getter para obter o valor da variável (isto é visível para você)

  • um método setter para definir o valor da variável (isto é visível para você)

Em Objective-C 2 (lançado em 2007), propriedades nomeadas foram introduzidas. Eles fornecem uma maneira de simplificar essa estrutura, mas eles são totalmente compatíveis com ele. A propriedade chamada tem um formato como este:

@property (nonatomic forte,) ID detailItem- @ propriedade (fraco, nonatomic) IBOutletUILabel * detailDescriptionLabel-

A propriedade começa com a diretiva de compilação @propriedade seguida pelos atributos de memória e uso de parênteses, como Forte, fraco, somente leitura, e nonatomic - os significados específicos não importa neste momento.

Video: 10 Dicas de Ouro para o Bom Designer Gráfico



Após os atributos entre parênteses são o tipo da propriedade e, em seguida, seu nome. Para os tipos de objectos, um apontador são utilizados. O tipo de classe identidade não é um ponteiro. Mais uma vez, os detalhes não importam neste momento.

O que importa é que, com uma declaração de propriedade, o compilador é capaz de declarar e criar uma automaticamente apoio variável, que é a própria variável, onde os dados são armazenados. Ela também é capaz de criar um getter e um compositor utilizando as convenções descritas anteriormente (o getter é o nome da variável e o passador é setMyVariable).

Várias convenções entram em jogo aqui. Os nomes das variáveis ​​começar com uma letra minúscula. Se o nome da variável consiste de várias palavras, palavras após o primeiro começar com letras maiúsculas (isso é chamado camelCase). Métodos e funções começar com aulas de cartas- minúsculas começam com letras maiúsculas. As convenções encontrar-se em nome de um setter.

Considere uma variável chamada myVariable cuja setter é chamado setMyVariable. Isso está em conformidade com a convenção de que os métodos começam com letras minúsculas, e também está em conformidade com a convenção camelCase. No entanto, porque o encontro dessas duas convenções pode sugerir o nome setmyVariable, camelCase substitui outras convenções.

Assim, as propriedades nomeadas reduzir a quantidade de tipagem necessário para usar propriedades por ter o compilador que o trabalho de criar os assessores get e set e de criar a variável de apoio.

Em alguns casos, os desenvolvedores têm necessário mais controle sobre as coisas. Os dois casos mais comuns desta foram os seguintes:

  • Quando um desenvolvedor precisa de uma variável de apoio ter um certo nome e precisa ser capaz de acessá-lo diretamente.

  • Quando o setter ou o getter precisa fazer mais do que apenas definir ou obter o valor de uma variável.

Aqui é onde a complexidade começa a entrar.

O sintetizador automatizado propriedade sintetiza uma variável de suporte com o nome da propriedade precedido por um sublinhado. Assim, o padrão apoio variável para minha propriedade é _minha propriedade. (Você pode definir isso como uma opção na declaração de propriedade.)

Você também pode escrever seus próprios assessores. É comum ter-los a realizar tarefas adicionais acima e além de suas funções de assessor simples. Um dos mais comum dessas tarefas é estabelecer uma conexão de banco de dados de modo que um getter pode obter um valor previamente armazenado em sua propriedade.

Video: Profissão: designer gráfico! Bate papo com Gui Poulain

Existem muitas outras variações sobre esta estrutura (incluindo propriedades que não têm variáveis ​​de apoio, mas simplesmente confiar em um getter para calcular ou recuperar um valor de acordo com a necessidade). E, apenas para completar esta parte da imagem, você pode misturar e combinar as propriedades com variáveis ​​tradicionais (variáveis ​​nus não são parte de uma propriedade declarada).

Muitos dos argumentos contra o uso de propriedades nomeadas (e eles foram amargo) giram em torno do fato de que o acesso a um valor propriedades nomeado na variável de apoio requer mais recursos da máquina do que apenas acesso a um local de memória. Com os computadores de hoje - mesmo em dispositivos móveis - isto pode parecer uma reação extrema, mas tem sido comum em alguns círculos.

Este, então, é o mundo das propriedades e variáveis ​​que aborda Swift. Se todas as suas complexidades e combinações são necessárias vale a pena discutir: Todos tem encontrado usos em aplicativos e até mesmo nos quadros da Apple que compõem Cacau e Cocoa Touch.

Há uma outra camada de complexidade em relação às declarações de propriedades e variáveis. A maioria das declarações das classes de código Objectivo-C são colocados em um ficheiro de cabeçalho no @interface seção. (Por convenção, este arquivo é nomeado com um .h após o nome da classe.)

Muito recentemente (no final dos anos 2000), tornou-se lugar comum para adicionar uma segunda @interface seção no formato de uma extensão de classe no corpo principal do arquivo de classe (o arquivo com o .m extensão). Declarações no arquivo de cabeçalho podem ser agrupados em seções com vários acessos - público, privado, e protegido. público e privado interfaces são apenas isso. protegido elementos de interface são visíveis para a própria classe e para qualquer uma de suas subclasses.

Finalmente, dentro do arquivo principal (o .m arquivo de extensão), você pode acessar a variável de apoio usando seu nome, como em _myBackingVariable. Isso ignora o uso do getter e salva alguns ciclos de máquina. Ele também pode ficar do lado-a etapa de processamento adicional que o getter does- esta convenção pode ser muito útil.

Este é o fundo de propriedades e variáveis ​​em Objective-C e agora em Swift.


Publicações relacionadas