Question

J'ai une application que j'écris qui utilise uniquement @properties. Je n'ai aucun ivar déclaré du tout dans aucun de mes fichiers de classe. Si je comprends bien, les ivars ne sont plus nécessaires avec l'introduction de @property. Suis-je en codage selon les meilleures pratiques? Cela finira-t-il par me mordre dans les fesses proverbiales à long terme? J'ai lu des critiques mitigées sur ce qui est "bien" et "mal" ...

Était-ce utile?

La solution

Je ne déclare généralement pas non plus les ivars. J'utiliserai souvent @synthesize foo = foo_; mais pour éviter un accès direct lorsque je voulais dire par méthode ou vice-versa. Et je laisse toujours le compilateur synthétiser automatiquement l'ivar avec le _ préfixe (qui empêche un accès direct accidentel, selon le frappé phrase).

Et, comme l'a dit Caleb, il y a encore des ivars qui flottent, vous ne les déclarez tout simplement pas explicitement à moins que vous ne vouliez vraiment le faire (ce qui, vraiment, vous n'êtes pas aussi exposé, les en-têtes ne sont pas utiles aux clients de la classe , si votre API est conçue de manière appropriée).

Je trouve également que le battage médiatique "utilise uniquement un accès direct dans init / dealloc, utilisez Setter / Getter partout ailleurs" pour être largement exagéré et, ainsi, utilisez simplement le secteur / getter partout. La réalité est que si vous avez des observateurs lors de l'initialisation / de la négociation, vous êtes déjà arrosé; L'état de l'objet est, par définition, non défini pendant la construction / destruction et, par conséquent, un observateur ne peut pas raisonner correctement sur l'état.


Comme le souligne Caleb, une autre raison d'utiliser l'accès direct à IVAR dans INIT / DEFADLOC est d'éviter les sous-classes qui implémentent la logique du secteur / getter personnalisé qui peut BORF en raison de l'état indéfini de l'objet pendant INIT / DEFALLOC.

Bien que cela puisse être vrai, je le considère comme un défaut architectural désagréable pour implémenter les setters / getters avec un comportement personnalisé. Cela est fragile et rend beaucoup plus difficile de refacter le code au fil du temps. De plus, un tel comportement personnalisé aura souvent une dépendance à l'égard de l'autre état au sein de l'objet et cette dépendance conduit alors à la dépendance de l'ordre sur les changements d'état qui ne sont pas du tout reflétés par le simple simple @property déclaration.

C'est-à-dire si vos setters et getters sont écrits de telle sorte que foo.bar = bad; ne peut pas être exécuté à n'importe quel il est temps foo, alors votre code est éclaté.

Autres conseils

Ce n'est pas tant que les variables d'instance ne sont pas nécessaires. C'est juste cette variable d'instance déclarations ne sont pas nécessaires. Compte tenu d'une propriété et d'une instruction @SyntheSize, le compilateur s'occupera de créer la variable d'instance avec des méthodes d'accessoires appropriées.

Il n'y a rien de mal à utiliser les propriétés exclusivement. Ils simplifient la gestion de la mémoire. Il n'y a pas non plus de mal à utiliser des ivars sans propriétés, si c'est ce que vous voulez. Si vous souhaitez utiliser des propriétés mais que vous ne souhaitez pas annoncer les accessoires au reste du monde (c'est-à-dire maintenir l'encapsulation), pensez à déclarer vos propriétés non publiques dans une extension de classe (essentiellement une catégorie anonyme dans votre fichier d'implémentation).

L'utilisation de IVARS n'est certainement pas erronée, mais les meilleures pratiques font maintenant pression pour utiliser @Property à la place.

Un endroit où vous voudrez peut-être utiliser un IVAR est lorsque vous souhaitez déclarer une propriété protégée. Vous déclarez la propriété dans le fichier .m pour une classe et déclarez son ivar correspondant dans le .h avec la directive @protected. Cela vous permettra alors d'avoir un accès protégé dans la sous-classe. Il n'y a pas d'alternative pour l'accès protégé aux membres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top