Objetivo-C:como evitar vazamentos de abstração
-
23-09-2019 - |
Pergunta
Entendo que no Objective-C devo declarar variáveis de instância como parte da interface da minha classe, mesmo que essas variáveis sejam detalhes de implementação e tenham acesso privado.
Em C "subjetivo", posso declarar uma variável em meu arquivo .c e ela não é visível fora dessa unidade de compilação.Posso declará-lo no arquivo .h correspondente, e então qualquer pessoa que fizer um link nessa unidade de compilação poderá ver a variável.
Gostaria de saber se existe uma escolha equivalente em Objective-C ou se devo realmente declarar cada ivar no .h para minha classe.
Ari.
Solução
Ari,
Uma boa referência sobre como realizar declarações de variáveis de instância "invisíveis" pode ser encontrado aqui com crédito respeitosamente dado a Matt Gallagher.
Espero que ajude, Frank
Outras dicas
As variáveis de instância têm sido tradicionalmente necessárias para determinar o tamanho da classe.Sempre foi uma má prática acessar diretamente os ivars, e esse não é o ponto.No tempo de execução moderno, isso é menos necessário, mas de qualquer forma, não é um vazamento de abstração, a menos que os clientes dependam dos ivars da classe, o que deveria ser impossível, já que você os está declarando como @protected
ou @private
, certo?
Para restringir o acesso, você pode usar o @private
ou @protected
palavras-chave:
@interface Foo : NSObject {
@private
int barPrivate;
@protected
int barProtected;
@public
int barPublic;
}
@end
EDITAR: Raspe tudo, acontece que eu realmente preciso dormir um pouco.
ivars são @protected
por padrão (embora @private
e @protected
não garanta que outras classes não possam acessá-los - você sempre pode acessar ivars com getValue:forKey:
).Você nunca deve acessar diretamente os ivars de outras classes em qualquer caso - a "escolha" é expor ou não os ivars como propriedades (você apenas precisa confiar em todas as classes que seguem a convenção para não acessar os ivars diretamente).
No novo tempo de execução do objetivo-c, você não precisa declarar ivars, pois eles podem ser sintetizados em tempo de execução, mas infelizmente isso não funciona com o simulador do iPhone, então, por enquanto, é melhor apenas declarar todos os ivars no arquivo .h.