Depois de ler humildemente um artigo chamado "Os mandamentos de código: práticas recomendadas para codificação de Objective-C", de Robert McNally, há pouco menos de dois anos, adotei a prática de usar propriedades para praticamente todos os membros de minhas classes de Objective-C ( o terceiro mandamento em maio de 2012). McNally lista estas razões para fazê-lo (minha ênfase):
- As propriedades aplicam restrições de acesso (como somente leitura)
- As propriedades aplicam a política de gerenciamento de memória (forte, fraca)
- As propriedades oferecem a oportunidade de implementar de forma transparente setters e getters personalizados.
- As propriedades com setters ou getters personalizados podem ser usadas para impor uma estratégia de segurança de encadeamento.
- Ter uma maneira única de acessar variáveis de instância aumenta a legibilidade do código.
Eu coloquei a maioria das minhas propriedades em categorias particulares, portanto, os números 1 e 4 geralmente não são problemas nos quais eu corro. Os argumentos 3 e 5 são mais "flexíveis" e, com as ferramentas certas e outras consistências, podem se tornar problemas. Então, finalmente, para mim, o mais influente desses argumentos foi o número 2, gerenciamento de memória. Eu venho fazendo isso desde então.
@property (nonatomic, strong) id object; // Properties became my friends.
Nos meus últimos projetos, mudei para o uso do ARC, o que me fez duvidar que a criação de propriedades para praticamente qualquer coisa ainda seja uma boa ideia ou talvez um pouco supérflua. O ARC cuida da memória gerenciando objetos Objective-C para mim, o que para a maioria dos strong
membros funciona bem se você apenas declarar os ivars. Os tipos C que você precisava gerenciar manualmente de qualquer maneira, antes e depois do ARC, e as weak
propriedades são principalmente públicas.
É claro que ainda uso propriedades para qualquer coisa que precise de acesso de fora da classe, mas essas são apenas algumas propriedades, enquanto a maioria dos membros de dados é listada como ivars sob o cabeçalho de implementação
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
Como experimento, tenho feito isso com um pouco mais de rigor, e a mudança de propriedades para tudo tem alguns efeitos colaterais positivos.
- Os requisitos de código do membro de dados (
@property
/@synthesize
) diminuíram apenas para a declaração ivar. - A maioria das minhas
self.something
referências foi limpa_something
. - É fácil distinguir quais membros de dados são privados (ivars) e quais são públicos (propriedades).
- Por fim, parece que esse era o objetivo para o qual as propriedades da Apple se destinavam, mas isso é especulação subjetiva.
Sobre a questão : estou lentamente deslizando em direção ao lado sombrio, usando cada vez menos propriedades a favor da implementação-ivars. Você pode me fornecer um pouco de raciocínio sobre por que devo usar propriedades para tudo ou confirmar minha corrente de pensamentos sobre por que devo usar mais ivars e menos propriedades somente quando necessário? A resposta mais persuasiva para ambos os lados receberá minha nota.
EDIT: McNally comenta no Twitter, dizendo : "Acho que meu principal motivo para manter as propriedades é: uma maneira de fazer tudo, que faz tudo (incluindo KVC / KVO.)"