80 votes

Notation point contre notation de message pour les propriétés déclarées

Nous avons maintenant le "point" de la notation pour les propriétés. J'ai vu plusieurs en arrière et voyages aller sur le bien-fondé de la notation point vs message de notation. Pour garder les réponses irréfutables je ne vais pas répondre de toute façon dans la question.

Qu'est-ce que votre pensée au sujet de la notation point vs message de notation pour l'accédant à la propriété?

S'il vous plaît essayer de le garder concentré sur l'Objectif-C - ma un biais je vais mettre en avant est que l'Objective-C Objective-C, de sorte que votre préférence qu'il soit comme le Java ou JavaScript ne sont pas valides.

Valide le commentaire est à voir avec des questions techniques (fonctionnement de la commande, la fonte de la priorité, de la performance, etc), la clarté (structure vs objet de la nature, à la fois pro et con!), la concision, etc.

Remarque, je suis de l'école de rigoureux de la qualité et de la lisibilité dans le code pour avoir travaillé sur de gros projets, là où le code de la convention et de la qualité est primordiale (l'écrire une fois lu mille fois paradigme).

64voto

bbum Points 124887

N'utilisez pas de dot pour le comportement. Utilisez le point d'accès ou un ensemble d'attribut comme des choses, généralement des attributs déclarés en tant que propriétés.

x = foo.name; // good
foo.age = 42; // good

y = x.retain; // bad

k.release; // compiler should warn, but some don't. Oops.

v.lockFocusIfCanDraw; /// ooh... no. bad bad bad

Pour les gens nouveaux à Objective-C, je vous recommande de ne pas utiliser le point pour rien, mais des trucs a déclaré que les @property. Une fois que vous avez une idée de la langue, de faire ce qui se sent le droit.

Par exemple, je trouve le suivre parfaitement naturel:

k = anArray.count;
for (NSView *v in myView.subviews) { ... };

Vous pouvez s'attendre à ce que le cliquetis analyseur statique augmentera la capacité pour vous permettre de vérifier que le point est utilisé uniquement pour certains modèles ou pas pour certains autres modèles.

22voto

Dave DeLong Points 156978

Permettez-moi de commencer par dire que j'ai commencé la programmation en Visual/Réel de Base, pour ensuite s'en Java, donc je suis assez utilisé pour la syntaxe à point. Cependant, lorsque je suis enfin passé à l'Objective-C et entre parenthèses, puis a vu l'introduction d'Objective-C 2.0 et sa syntaxe à point, j'ai réalisé que je n'aime vraiment pas ça. (pour les autres langues, c'est bien, parce que c'est comment ils roulent).

J'ai trois principales renforce avec la syntaxe à point en Objective-C:

Boeuf #1: Il rend difficile de comprendre pourquoi vous avez peut-être des erreurs. Par exemple, si j'ai la ligne:

something.frame.origin.x = 42;

Alors, je vais obtenir une erreur de compilation, car something est un objet, et vous ne pouvez pas utiliser les structures d'un objet comme la lvalue d'une expression. Cependant, si j'ai:

something.frame.origin.x = 42;

Alors cette compile très bien, car something est une structure qui a une NSRect membre, et je peux l'utiliser comme une lvalue.

Si j'étais l'adoption de ce code, j'aurais besoin de passer un peu de temps à essayer de comprendre ce qu' something . Est-ce une struct? Est-il un objet? Cependant, lorsque nous utilisons le support de la syntaxe, c'est beaucoup plus clair:

[something setFrame:newFrame];

Dans ce cas, il n'y a absolument aucune ambiguïté si something est un objet ou non. L'introduction de l'ambiguïté est mon boeuf #1.

Boeuf #2: En C, la syntaxe à point est utilisé pour accéder aux membres de leurs structures, de ne pas appeler les méthodes. Les programmeurs peuvent remplacer l' setFoo: et foo méthodes d'un objet, mais encore y accéder via something.foo. Dans mon esprit, quand je vois des expressions à l'aide de la syntaxe à point, je m'attends à être une simple assignation dans un ivar. Ce n'est pas toujours le cas. Considérons un objet contrôleur qui intervient dans un tableau et une tableview. Si je l'appelle, myController.contentArray = newArray;, je m'attends à ce qu'il soit en remplacement de l'ancien tableau avec le nouveau tableau. Toutefois, l'original, le programmeur peut avoir remplacé setContentArray: non seulement de définir la matrice, mais également recharger la tableview. À partir de la ligne, il n'y a aucune indication de ce comportement. Si je devais le voir [myController setContentArray:newArray];, puis je pense que "Aha, une méthode. J'ai besoin d'aller voir la définition de cette méthode juste pour faire sûr que je sais ce qu'il fait."

Je pense donc que mon résumé de Boeuf #2, c'est que vous pouvez remplacer le sens de la syntaxe à point avec un code personnalisé.

Boeuf #3: je pense qu'il est de mauvaise qualité. Objectif-programmeur en C, je suis totalement utilisé pour le support de la syntaxe, à la lecture de long et de voir des lignes et des lignes de belles parenthèses et puis pour être tout à coup brisé foo.name = newName; foo.size = newSize; etc est un peu gênant pour moi. Je me rends compte que certaines choses nécessitent la syntaxe à point (C struct), mais c'est la seule fois que je l'utilise.

Bien sûr, si vous écrivez du code pour vous-même, puis utilisez ce que vous sentez à l'aise avec. Mais si vous écrivez du code que vous avez l'intention de l'open source, ou vous écrivez quelque chose que vous ne vous attendez pas à maintenir pour toujours, alors je voudrais forte encourager l'utilisation du support de la syntaxe. C'est, bien sûr, juste mon avis.

Blog contre la syntaxe à point: http://weblog.bignerdranch.com/?p=83

Réfutation de post ci-dessus: http://eschatologist.net/blog/?p=226 (avec l'original de l'article en faveur de la syntaxe à point: http://eschatologist.net/blog/?p=160)

14voto

Ellie P. Points 1616

Je suis un nouveau Cocoa/Objective-C développeur, et de mon point de vue sur ce qu'elle est:

Je m'en tiens à la messagerie de notation, même si j'ai commencé avec l'Obj-C 2.0, et même si le point est plus familiers (Java est ma première langue.) Ma raison est assez simple: je ne comprends toujours pas exactement pourquoi ils ont ajouté la notation à points pour la langue. Pour moi, il semble inutile, "impure" plus. Bien que, si quelqu'un peut expliquer comment les avantages de la langue, je serais heureux de l'entendre.

Cependant, je considère que c'est un choix stylistiques, et je ne pense pas qu'il y est une bonne ou de mauvaise façon, tant que c'est cohérent et lisible, tout comme avec tout autre choix stylistiques (comme mettre votre accolade d'ouverture sur la même ligne que la méthode d'en-tête ou de la ligne suivante).

11voto

aleroot Points 30853

Objective-C dot notation est un sucre syntaxique qui est traduit à la normale de la transmission de message, donc sous le capot, rien ne change et ne fait pas de différence lors de l'exécution. La notation point il n'est absolument pas plus vite que la transmission de message.

Après cette petite préambule voici les avantages et les inconvénients vu par moi :

La notation point des avantages et des inconvénients

  • pros

    • la lisibilité : la notation point est plus facile à lire que les parenthèses imbriquées massages en passant
    • Il simplifie l'interaction avec des Attributs et des Propriétés: à l'aide de la notation de point pour les propriétés de message et de notation pour les méthodes que vous pouvez obtenir la séparation de l'etat et de comportement au niveau de la syntaxe
    • Il est possible d'utiliser l'opérateur d'assignation composé (1).
    • à l'aide de l' @property et la notation point le compilateur de faire beaucoup de travail pour vous, il peut générer du code pour la bonne Gestion de la Mémoire lors de l'obtention et définition de la propriété; c'est pourquoi la notation point est suggéré par Apple lui-même, des guides officiels.
  • cons

    • La notation point n'est autorisée que pour l'accès à l'déclarée @property
    • Depuis Objective-C est un calque au-dessus de la norme C(extension du langage), le point n'est pas vraiment clair si l'accès entité est un objet ou une structure. Souvent, on dirait que vous êtes l'accès aux propriétés d'une struct.
    • l'appel d'une méthode avec la notation par points, vous perdez les paramètres nommés lisibilité avantages
    • lorsqu'il est mélangé message de notation et de la notation point semble que vous êtes le codage en deux langues différentes

Code Des Exemples :

(1)l'opérateur Composé d'utilisation exemple de code :

//Use of compound operator on a property of an object
anObject.var += 1;
//This is not possible with standard message notation
[anObject setVar:[anObject var] + 1];

7voto

AlBlue Points 7768

En utilisant le style d'une langue, compatible avec le langage lui-même, est le meilleur conseil. Cependant, ce n'est pas un cas de l'écriture du code fonctionnel dans un OO système (ou vice versa) et la notation par points est une partie de la syntaxe en Objective-C 2.0.

Tout système peut être utilisé à mauvais escient. L'existence du préprocesseur dans toutes les C en fonction des langues est assez pour faire vraiment des choses étranges; il suffit de regarder la Obfuscated C Concours si vous avez besoin de voir exactement bizarre comment il peut obtenir. Est-ce à dire que le préprocesseur est automatiquement mauvais, et que vous devriez ne jamais les utiliser?

À l'aide de la syntaxe à point pour accéder aux propriétés, qui ont été définis comme tels dans l'interface, est ouverte à des abus. L'existence de la violence dans la potentia ne doit pas nécessairement être l'argument contre elle.

L'accès à la propriété peut avoir des effets secondaires. C'est orthogonale à la syntaxe utilisée pour acquérir cette propriété. CoreData, de délégation, de propriétés dynamiques (premier+dernier=) va nécessairement faire un peu de travail sous les couvertures. Mais que serait confusion "variables d'instance" par "propriétés" d'un objet. Il n'y a aucune raison pourquoi les propriétés doivent nécessairement être stockées en tant que-est, en particulier si elles peuvent être calculées (par exemple, la longueur d'une Chaîne, par exemple). Donc, si vous utilisez foo.fullName ou [foo fullName] il y a toujours en cours à la dynamique de l'évaluation.

Enfin, le comportement de la propriété (lorsqu'il est utilisé comme une lvalue) est défini par l'objet lui-même, comme si une copie est prise ou si elle est conservée. Cela rend plus facile de changer le comportement plus tard dans la définition de propriété lui-même - plutôt que d'avoir à re-mettre en œuvre des méthodes. Qui ajoute à la flexibilité de l'approche, avec la probabilité de moins (mise en œuvre), des erreurs se produisent. Il y a toujours la possibilité de choisir la mauvaise méthode (c'est à dire copier au lieu de les conserver), mais c'est une architecture plutôt que de problème de mise en œuvre.

Finalement, il se résume à la "il ressemble à un struct' question. C'est probablement le principal facteur de différenciation dans les débats jusqu'à présent; si vous avez un struct, il fonctionne différemment que si vous avez un objet. Mais ça a toujours été vrai; vous ne pouvez pas envoyer un struct un message, et vous avez besoin de savoir si c'est pile, ou de référence/malloc base. Il existe déjà des modèles mentaux qui diffèrent en termes de consommation ([[CGRect alloc] init] ou struct CGRect?). Ils n'ont jamais été unifiée en termes de comportement; vous devez savoir ce que vous faites affaire avec dans chaque cas. L'ajout de la dénotation de propriété pour les objets est très peu probable de confondre tout programmeur qui sait ce que les types de données; et s'ils ne le font pas, ils ont plus de problèmes.

Comme pour la cohérence; (Objectif-)C est pas cohérent avec lui-même. = est utilisé à la fois pour l'affectation et de l'égalité, en fonction lexicale position dans le code source. * est utilisé pour les pointeurs et la multiplication. Bool sont les caractères, pas d'octets (ou autre valeur entière), malgré le OUI et le NON étant de 1 et 0 respectivement. La cohérence ou de la pureté n'est pas ce que le langage a été conçu pour; c'était à propos de faire les choses.

Donc, si vous ne voulez pas l'utiliser, ne l'utilisez pas. Le faire d'une manière différente. Si vous voulez l'utiliser, et que vous le comprenez, c'est très bien si vous l'utilisez. D'autres langues traiter avec les concepts génériques qui sont des structures de données (cartes/les structures) et les types d'objets (avec des propriétés), souvent en utilisant la même syntaxe pour les deux, malgré le fait que l'on est simplement une structure de données et l'autre est un objet riche. Les programmeurs en Objective-C doit avoir un équivalent de la capacité à être en mesure de faire face avec tous les styles de programmation, même si ce n'est pas votre préféré.

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