Dot notation Syntaxe

Quand j'enseigne, je fais toujours sûr de mentionner l'ajout de points notation à Objective-C 2.0. Ensuite, je fais en sorte de dire aux étudiants de ne jamais utiliser jamais, jamais, jamais. Mais pourquoi? Pourquoi cette haine apparemment irrationnelle des points notation? Est-ce un choix de style et nous « bracketeers » sont en cours têtu? La réponse est non, nous ne sommes pas têtu, nous maintenons notre code uniforme et le maintien de la lisibilité.







L'intention du Code

Les conventions d'appellation utilisées dans Cocoa et Cocoa Touch sont claires et simples. Quand on regarde bien le code écrit Mac ou iPhone, nous pouvons dire exactement ce qui se passe en regardant il. C'est le pouvoir que Objective-C nous donne. Si je veux un objet de prendre un verre d'eau tout en faisant un cartwheel, je l'envoie le message suivant:

[Obj takeDrinkOfLiquid: whileDoingCartwheel d'eau: OUI];

Nous savons exactement ce que cela signifie. Il n'y a pas de place à l'interprétation. De même, nous savons exactement ce que cette ligne de code fait:

Cela ajoute b et la valeur 5 ensemble et affecte le résultat à la variable a. Nous obtenons ces opérateurs, = et +. à partir du langage de programmation C. Nous avons beaucoup plus d'opérateurs en C, comme ***, ** /. -. % et -. Et nous savons ce que tous ces opérateurs veulent dire. Quand nous les voyons, nous disons des choses comme: «C'est une division! » Ou «C'est une soustraction! » Sauf que nous ne disons pas que. Nous ne pensons même pas à ce sujet. Nous savons instantanément.

Un autre opérateur qui est couramment utilisé dans C est. opérateur. L'opérateur point accède à un membre d'une structure. Il va à une adresse en mémoire (l'adresse de l'objet de structure) plus un décalage. C'est tout ce qu'il fait. Nous savons instantanément ce que cela signifie.

En Objective-C, les crochets ([]) ont été ajoutés pour l'envoi du message. Alors que les crochets avaient déjà été utilisés uniquement pour indexer un tableau, l'intention des crochets peut être facilement déterminée par le contexte.

Avec cela, nous pouvons dire que nous savons pertinemment ce que les opérateurs en Objective-C font un rapide coup d'oeil.

Vient ensuite Objective-C 2.0 ...

Avec Objective-C 2.0, on obtient le notation. De nombreux nouveaux programmeurs à Objective-C comme point notation, il leur rappelle d'autres langues qu'ils sont plus compétents dans. À l'exception de la notation par points ne fait pas la même chose en Objective-C comme dans d'autres langues.

Notation de point en Objective-C invoque une méthode d'instance. Code dans une définition de méthode est exécutée lorsque ce point est utilisé. Ce code pourrait être simple et il pourrait simplement renvoyer une valeur. Cela ne provoque pas un gros problème. Cependant, si cette méthode est beaucoup plus costaud:







Cette méthode pourrait mal tourner dans un certain nombre de façons. Quand on voit l'invocation de cette méthode avec un point-notation, tout ce que nous voyons est la suivante:

Qu'est-ce que ça veut dire? Sommes-nous obtenir le champ de valeur de l'objet de structure foo. Sommes-nous exécutons une méthode simple qui retourne une valeur? Ou, dans ce cas, nous sommes en train de créer une connexion réseau, en tirant une valeur à partir d'un serveur Web, transformant les données pour un entier, puis le retourner?

Il est ambigu. Avec le notation, nous ne savons pas exactement ce que ce code signifie au premier coup d'œil. Quand on voit ce code:

Notre premier coup d'œil nous dit que nous envoyons un message sans aucun doute. Cela nous des indices en ce que plus le travail est fait, pas seulement une simple mémoire de décalage et une affectation.

Ce qui est plus déroutant, surtout aux nouveaux arrivants Objective-C, invoque une méthode setter avec un point-notation.

En C ou C ++, ceci est une simple affectation. En Objective-C, cela pourrait facilement créer une copie de otherObject ou de conserver otherObject. On ne voit pas immédiatement de cette ligne de code. La difficulté de comprendre le comptage de référence en tant que débutant est amplifié par le code comme celui-ci. Notre code prend pour lire plus. Nous devons creuser autour de déterminer ce qui se passe réellement dans cette ligne de code.

contexte même, même opérateur, le fonctionnement différent. Nous ne savons pas ce que cet opérateur ne plus.

Valeurs de retour

Voici un autre exemple:

Très simple, nous mettons la largeur du cadre de vue de 30 pixels.

En fait non. Nous ne sommes pas. Nous générons une erreur de compilation. La valeur retournée par une invocation notation 'est pas une lvalue. Nous ne pouvons pas l'affecter quoi que ce soit. Toutefois, si someView est une structure, cette ligne de code fonctionnera comme prévu.

Nous perdons la cohérence dans notre code à l'aide de l'opérateur point. Un opérateur dans le même contexte, l'un est un code valide, on n'est pas. (Il est aussi une bonne chose que la première ligne génère une erreur de compilation, sinon, nous ne ferions que de modifier votre copie du cadre de someView, pas la variable d'instance de someView.)

Maintenant, c'est source de confusion.

Mais je suis habitué à C #, C ++ ou Java

J'entends parfois que la notation de points ressemble à la maison. Vous n'êtes pas à la maison. Vous travaillez avec une autre langue.

Si une langue résolu tous les problèmes, tout le monde utiliserait cette langue. Chaque langue et l'API est un outil et il a une utilisation prévue. En utilisant le notation en Objective-C serait semblable à clous marteler avec un tournevis. Bien sûr, cela fonctionne la plupart du temps, mais il est pas la meilleure utilisation d'un tournevis ou la meilleure façon de marteler les clous. Finalement, vous pourriez casser votre main.

Les utilisateurs de notation 'sont généralement nouveau à Objective-C. Ceci est probablement l'intention de notation '; une syntaxe plus familière pour les programmeurs venant d'autres langues. Cependant, vous seriez mieux vous familiariser avec Objective-C, puis faire semblant est une autre langue. Vous passerez moins de temps confus et plus de temps à résoudre un problème plus grave.

Apple utilise dans son exemple de code, bien!

C'est vrai, ils le font. Maintenant, en dépit de ce que l'aide est-kool fait que vous pensez, Apple ne se quelque chose de mal de temps en temps. Leur exemple de code a toujours été conçu à la hâte pour obtenir aux développeurs d'utiliser leur plate-forme. Il est pas toujours le meilleur exemple de la façon d'utiliser une langue.

Je crois, après avoir enseigné quelque 300 étudiants Objective-C, ce point-notation est source de confusion. Elle entrave l'objectif principal du développement logiciel: l'écriture de code maintenable, efficace, efficace, facile à lire et sans bug.

En fin de compte, il y a mauvaise façon et une bonne façon d'écrire du code Objective-C. Je ne vais pas dire que en utilisant le notation est la mauvaise façon. Il est un moyen acceptable d'écrire du code Objective-C. Je vais cependant dire qu'il ya une meilleure façon d'écrire votre code. La meilleure façon ne comprend pas le notation.