Dot-Notation Syntax
Als ich lehre, habe ich immer sicherstellen, dass 2.0 die Punktnotation zusätzlich zu Objective-C zu nennen. Dann stelle ich sicher, um die Schüler zu sagen nie, es zu benutzen immer, immer, immer und immer wieder. Aber warum? Warum diese scheinbar irrationalen Hass auf Punktnotation? Ist das eine Art Wahl und wir „bracketeers“ wird nüchterne? Die Antwort ist nein, wir sind nicht zu werden nüchterne, halten wir unseren Code konsistent und Aufrechterhaltung der Lesbarkeit.
Die Absicht des Kodex
Die Namenskonventionen verwendet in Cocoa und Cocoa Touch sind klar und einfach. Wenn wir auf gut aussehen Mac oder iPhone-Code geschrieben, können wir genau sagen, was es durch einen Blick vor sich geht. Das ist die Kraft, die Objective-C uns gibt. Wenn ich ein Objekt will einen Schluck Wasser zu nehmen, während ein Wagenrad zu tun, ich sende die Nachricht:
[Obj takeDrinkOfLiquid: Wasser whileDoingCartwheel: JA];
Wir wissen genau, was das bedeutet. Es gibt keinen Raum für Interpretationen. Ebenso wissen wir genau, was der Code diese Zeile tut:
Dies fügt den Wert b und 5 zusammen und ordnet das Ergebnis der Variablen a. Wir bekommen diese Operatoren = und +. von der Programmiersprache C. Wir haben viel mehr Operatoren in C, wie ***, ** /. -. % und -. Und wir wissen, was alle diese Betreiber bedeuten. Wenn wir sie sehen, sagen wir Dinge wie: „Das ist eine Division ist!“ Oder „Das ist eine Subtraktion“ Außer wir das nicht sagen. Wir denken nicht einmal darüber. Wir wissen sofort.
Ein anderer Betreiber, die häufig in C verwendet wird, ist die. Operator. Der Punkt-Operator greift auf ein Element einer Struktur. Es geht an eine Adresse im Speicher (die Adresse des Strukturobjekts) plus einen Offset. Das ist alles, es tut. Wir wissen sofort, was es bedeutet.
In Objective-C wurden die eckigen Klammern ([]) hinzugefügt, um Nachricht zu senden. Während die eckigen Klammern nur zum Indexieren eines Arrays verwendet worden waren zuvor, kann die Absicht der Klammern leicht durch den Kontext bestimmt werden.
Damit können wir sagen, dass wir auf jeden Fall wissen, was die Betreiber in Objective-C mit einem kurzen Blick zu tun.
Dann kommt Objective-C 2.0 ...
Mit Objective-C 2.0, wir Punktnotation bekommen. Viele Programmierer neu in Objective-C wie Punktnotation, es erinnert sich an anderen Sprachen, die sie mehr beherrschen. Mit Ausnahme der Punktnotation ist die gleiche Sache in Objective-C nicht tun, wie es in anderen Sprachen tut.
Dot-Notation in Objective-C ruft eine Instanz-Methode. Code in einer Methodendefinition wird ausgeführt, wenn dieser Punkt verwendet wird. Dieser Code könnte einfach sein und es könnte nur einen Wert zurückgeben. Das führt nicht zu viel von einem Problem. Was aber, wenn diese Methode ist viel beefier:
Das Verfahren könnte in einer Reihe von Möglichkeiten schief gehen. Wenn wir den Aufruf dieser Methode mit Punktnotation zu sehen, alles, was wir sehen ist:
Was bedeutet das? Sind wir das Wertefeld aus dem Strukturobjekt foo bekommen. Ausgeführt werden wir eine einfache Methode, die einen Wert zurückgibt? Oder, in diesem Fall, schaffen wir eine Netzwerkverbindung, einen Wert von einem Web-Server zieht, dass die Daten in Drehen zu einer ganzen Zahl und dann zurückkehren?
Es ist nicht eindeutig. Mit Punktnotation, wissen wir nicht genau, was dieser Code auf den ersten Blick bedeutet. Wenn wir sehen diesen Code:
Unser erster Blick sagt uns, senden wir auf jeden Fall eine Nachricht. Das Anhaltspunkt uns in dieser mehr Arbeit geleistet wird, nicht nur ein einfacher Speicher-Offset und eine Zuordnung.
Was verwirrend ist, vor allem in Objective-C Neulinge, ist eine Set-Methode mit Punktnotation aufgerufen wird.
In C oder C ++, ist dies eine einfache Aufgabe. In Objective-C, das die Schaffung leicht eine Kopie otherObject oder Halt otherObject werden könnte. Es ist nicht sofort ersichtlich, aus dieser Zeile Code. Die Schwierigkeit des Verstehens als Anfänger Referenzzählung wird von Code wie folgt verstärkt. Unser Code dauert länger zu lesen. Wir haben um zu graben, um zu bestimmen, was tatsächlich in dieser Codezeile geschieht.
Dieser Zusammenhang gleiche Betreiber, verschiedener Betrieb. Wir wissen nicht, was dieser Operator mehr der Fall ist.
Rückgabewerte
Hier ist ein weiteres Beispiel:
Sehr einfach, sind wir, die Breite eines Rahmens im Hinblick auf 30 Pixel.
Nicht wirklich. Wir sind nicht. Wir erzeugen, einen Compiler-Fehler. Der Wert, der durch einen strich Notation Aufruf zurückgegeben wird, ist nicht ein L-Wert. Wir können es nichts zuordnen. Wenn jedoch someView eine Struktur ist, wird diese Zeile Code wie vorgesehen.
Wir verlieren Konsistenz in unserem Code, um den Punkt-Operator. Ein Operator in diesem Zusammenhang ist ein gültiger Code, ist man nicht. (Es ist auch eine gute Sache, dass erste Zeile einen Compiler-Fehler erzeugt, sonst würden wir nur die Kopie von someView ‚s Rahmen werden zu ändern, nicht die Instanzvariable someView.)
Nun, das ist verwirrend.
Aber ich bin zu C # verwendet, C ++ oder Java
Ich höre manchmal, dass Punktnotation wie zu Hause aussieht. Sie sind nicht zu Hause. Sie arbeiten mit einer anderen Sprache.
Wenn eine Sprache alle Probleme gelöst, würde jeder diese Sprache verwenden. Jede Sprache und API ist ein Werkzeug, und es hat einen bestimmungsgemäßen Gebrauch. Mit Punktnotation in Objective-C, hiesse Nägel mit einem Schraubendreher Stampfen. Sicher, es funktioniert die meiste Zeit, aber es ist nicht die beste Verwendung eines Schraubendrehers oder die beste Art und Weise Nägel zu hämmern. Schließlich könnten Sie Ihre eigene Hand zerschlagen.
Benutzer von Punktnotation sind in der Regel neu in Objective-C. Dies ist wahrscheinlich die Absicht der Punktnotation; eine bekannte Syntax für Programmierer aus anderen Sprachen kommen. Allerdings wäre es besser, sich mit Objective-C vertraut dann vorgibt, es eine andere Sprache. Sie werden weniger Zeit verwirrt und mehr Zeit damit verbringen, ein größeres Problem zu lösen.
Apple verwendet sie in ihren Beispielcode, aber!
Das ist richtig, sie tun. Nun, trotz allem, was die Koolhilfe macht Sie denken, bietet Apple gelegentlich etwas falsch. Ihr Beispielcode wurde immer eilig gestaltete Entwickler, um ihre Plattform zu nutzen. Es ist nicht immer das beste Beispiel dafür, wie eine Sprache zu verwenden.
Es ist mein Glaube ist, nach etwa 300 Studenten Objective-C lehrt, dass Punktnotation ist verwirrend. Sie verhindert das Hauptziel der Software-Entwicklung: Schreiben wartbar, effektiv, effizient, leicht zu lesen und fehlerfreien Code.
Am Ende ist es falsch und ein richtiger Weg, Objective-C-Code zu schreiben. Ich will nicht sagen, dass die Verwendung von Punktnotation ist der falsche Weg. Es ist ein akzeptabler Weg, Objective-C-Code zu schreiben. Ich will aber sagen, dass es einen besseren Weg, um Ihren Code zu schreiben. Der bessere Weg beinhaltet keine Punktnotation.