55 votes

Préfixe des noms de propriété avec un trait de soulignement dans Objective C

J'ai déjà évité souligne dans mes noms de variables, peut-être un vestige de mon collège Java jours. Alors, quand j'définir une propriété en Objective C, c'est ce que j'ai naturellement.

// In the header
@interface Whatever
{
    NSString *myStringProperty
}

@property (nonatomic, copy) NSString *myStringProperty;

// In the implementation
@synthesize myStringProperty;

Mais dans presque tous exemple, il est fait comme

// In the header
@interface Whatever
{
    NSString *_myStringProperty
}

@property (nonatomic, copy) NSString *myStringProperty;

// In the implementation
@synthesize myStringProperty = _myStringProperty;

Devrais-je obtenir plus de mon aversion pour le souligner parce que c'est la façon dont il devrait être fait, est-il une bonne raison pour ce style préféré?

Mise à jour: automatique de la propriété de la synthèse de nos jours, vous pouvez laisser le @et de synthétiser le résultat est le même que si vous aviez utilisé

@synthesize myStringProperty = _myStringProperty;

ce qui montre clairement que vous Apple de préférence. Depuis, j'ai appris à cesser de s'inquiéter et à aimer le trait de soulignement.

47voto

Philippe Leybaert Points 62715

J'ai toujours utiliser des caractères de soulignement. Il crée une distinction claire entre les variables locales et les variables d'instance. Il évite également les messages du compilateur dans la situation suivante:

@interface MyClass
{
    NSString *name
}

@property (nonatomic, copy) NSString *name;

- (id) initWithName:(NSString *) name;
@end

@implementation MyClass

@synthesize name;

// The following method will result in a compiler warning
// (parameter name same as ivar name)
- (id) initWithName:(NSString *) name {
   if (self = [super init]) {
      self.name = name;
   }

   return self;
}

@end

EDIT:

Après avoir enduré downvotes et la lecture à travers les commentaires, permettez-moi d'essayer de faire de mon point de vue:

Apple recommande d'ivars ont le même nom que leurs biens. Apple recommande également que les propriétés commencer par une lettre minuscule. Et Apple recommande également que les collectivités locales de variables commencent par une lettre minuscule.

Maintenant, vous avez un problème, parce que quand vous lisez un morceau de code, et vous voyez une variable utilisée, vous ne pouvez pas' dire par la convention de nommage si cette variable est un ivar ou une variable locale. Qui suce. La solution est d'avoir différentes conventions de nommage pour ivars et les variables locales. C'est tout simplement du bon sens.

La façon de mettre en œuvre cette convention de nommage n'est pas pertinent. Si vous voulez vraiment, vous pouvez tout simplement ajouter "_WOOHAHA" à la ivar noms. Je n'aime pas (mais peut-être d'autres). Le truc, c'est que les gens qui savent ce qu'ils font ont décidé d'aller avec le "trait de soulignement préfixe" pour ivars. À mon humble avis, ils ont pris la bonne décision, même si leur propre société recommande de quelque chose d'autre. (les développeurs dont je parle sont les gens de l'écriture de certains des principaux Apple cadres de et les .NET Framework classes)

En fin de compte, la qualité du code est plus important que de respecter une règle stupide qui n'est pas encore suivie par le peuple de la prédication.


Une autre remarque sur le code que vous avez indiqué: ne jamais utiliser de conserver sur les propriétés de la chaîne. Vous devez utiliser le copier à la place.

Pour plus d'info à propos de copier/conserver sur propriétés, voir:

http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain

29voto

Taka Points 848

La convention de nommage pour la variable d'instance, le préfixe _ est maintenant clairement indiqué par Apple dans les "Directives de Codage pour le Cacao", après la révision de 2012-02-16, avec sa raison.

Assurez-vous que le nom de la variable d'instance décrit de façon concise l'attribut stocké. Habituellement, vous ne doivent pas accéder aux variables d'instance directement, au lieu de cela, vous devriez utiliser des méthodes accesseur (vous n'avez accès à des variables d'instance directement dans l'init et dealloc méthodes). Pour aider à le signaler, préfixe exemple les noms de variables avec un trait de soulignement (_), par exemple:

@implementation MyClass {
    BOOL _showsTitle;
}

Si vous synthétiser la variable d'instance à l'aide d'une propriété déclarée, spécifiez le nom de la variable d'instance dans le @synthétiser déclaration.

@implementation MyClass
@synthesize showsTitle=_showsTitle;

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-BAJGIIJE

Le cours sur iTunes U, l'Application iPhone de Développement CS193p l'Automne 2011 enseigné par Paul Hegarty à l'Université de Stanford, explique également cette convention.

http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id473757255

Je suis conscient de ce que cette question est posée depuis longtemps, mais j'ai moi-même eu la même question et je voulais partager mes découvertes.

18voto

mlwelles Points 277

Conseillé Objective-C 2.0 pratique est d'utiliser le même nom pour le ivar que la propriété. Vous pouvez aussi assigner un autre ivar dans le @déclaration de la propriété, mais le fait que par défaut, la synthèse des accesseurs pour une propriété de l'accès à l'ivar avec le même nom que la propriété indique que le modèle qu'ils attendent de vous que vous suivez.

Peu importe ce que, depuis des objets encore à envoyer des messages à eux-mêmes pour accéder à des propriétés, il est difficile de confondre lorsque vous avez accès à une propriété ou lorsque vous avez accès à un soutien ivar directement, mais à l'aide de la 2.0 dot accès aux propriétés, il est plus possible. En utilisant le standard de transmission de message syntaxe intention plus explicite, de l'OMI.

@interface Foo : NSObject {
     NSNumber *bar;
} 
@property(readwrite, retain) NSNumber * bar
@end

@implementation Foo 
@synthesize bar;

-(void) baz {
   NSNumber *numberOne = [NSNumber numberWithInt: 1];   
   //Both set the value of bar through either the your custom or the synthesized setter method
   [self setBar:numberOne];  
   self.bar = numberOne; 

   //Both get the value of bar through your synthesized or your custom accessor method
   NSNumber *fooBar = [self bar];
   fooBar = self.bar;

   //Both manipulate the bar ivar directly
   bar = numberOne;
   fooBar = bar;
}
@end 

6voto

JeremyP Points 46808

Apple se réserve sélecteurs début avec un trait de soulignement pour leurs propres méthodes "privées" et qui permettrait d'inclure des propriétés. Je ne pense pas qu'ils se réservent _ pour ivar noms, bien que.

Personnellement, je orienter clairement de l'utilisation de souligner pour commencer toute sorte de nom de variable. Il est opaque convention. Que faire si quelqu'un d'autre l'utilise trait de soulignement pour les habitants et pas de soulignement pour les variables d'instance? Que faire si vous avez accidentellement omettre le caractère de soulignement dans une méthode où vous avez un local défini avec le même nom?

C'est beaucoup mieux pour faire de votre local noms différents à partir de votre ivar noms. Par exemple, dans un setter vous pouvez utiliser newName ou neWValue.

3voto

KennyTM Points 232647

C'est purement une question de style.

Je ne sais pas quels exemples utilisent le style ivar souligné. Les exemples officiels Apple (par exemple, CryptoExercise ) ne préfixent pas les ivars avec _ .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X