Lassen Sie mich zunächst sagen, dass ich mit der Programmierung in Visual / Real Basic begonnen und dann zu Java übergegangen bin, sodass ich die Punktsyntax ziemlich gewohnt bin. Als ich jedoch schließlich zu Objective-C wechselte und mich an Klammern gewöhnte und dann die Einführung von Objective-C 2.0 und seiner Punktsyntax sah, stellte ich fest, dass es mir wirklich nicht gefällt. (Für andere Sprachen ist es in Ordnung, denn so rollen sie).
Ich habe drei Haupt-Beefs mit Punktsyntax in Objective-C:
Rindfleisch Nr. 1: Es macht unklar, warum Sie möglicherweise Fehler erhalten. Zum Beispiel, wenn ich die Zeile habe:
something.frame.origin.x = 42;
Dann erhalte ich einen Compilerfehler, da something
es sich um ein Objekt handelt und Sie die Strukturen eines Objekts nicht als Wert eines Ausdrucks verwenden können. Wenn ich jedoch:
something.frame.origin.x = 42;
Dann wird dies gut kompiliert, da something
es sich um eine Struktur handelt, die ein NSRect-Mitglied hat, und ich kann sie als Wert verwenden.
Wenn ich diesen Code übernehmen würde, müsste ich einige Zeit damit verbringen, herauszufinden, was something
ist. Ist es eine Struktur? Ist es ein Objekt? Wenn wir jedoch die Klammer-Syntax verwenden, ist es viel klarer:
[something setFrame:newFrame];
In diesem Fall gibt es absolut keine Mehrdeutigkeit, ob something
es sich um ein Objekt handelt oder nicht. Die Einführung von Mehrdeutigkeit ist mein Rindfleisch Nr. 1.
Beef # 2: In C wird die Punktsyntax verwendet, um auf Mitglieder von Strukturen zuzugreifen, nicht um Methoden aufzurufen. Programmierer können die setFoo:
und foo
Methoden eines Objekts überschreiben und dennoch über auf sie zugreifen something.foo
. Wenn ich Ausdrücke mit Punktsyntax sehe, erwarte ich, dass sie eine einfache Zuordnung zu einem Ivar darstellen. Dies ist nicht immer der Fall. Stellen Sie sich ein Controller-Objekt vor, das ein Array und eine Tabellenansicht vermittelt. Wenn ich anrufe myController.contentArray = newArray;
, würde ich erwarten, dass das alte Array durch das neue Array ersetzt wird. Der ursprüngliche Programmierer hat jedoch möglicherweise überschrieben, setContentArray:
um nicht nur das Array festzulegen, sondern auch die Tabellenansicht neu zu laden. Aus der Zeile gibt es keinen Hinweis auf dieses Verhalten. Wenn ich sehen würde[myController setContentArray:newArray];
Dann würde ich denken: "Aha, eine Methode. Ich muss mir die Definition dieser Methode ansehen, um sicherzugehen, dass ich weiß, was sie tut."
Ich denke, meine Zusammenfassung von Beef # 2 ist, dass Sie die Bedeutung der Punktsyntax mit benutzerdefiniertem Code überschreiben können.
Rindfleisch Nr. 3: Ich denke, es sieht schlecht aus. Als Objective-C-Programmierer bin ich es gewohnt, die Syntax in Klammern zu setzen. Es foo.name = newName; foo.size = newSize;
ist also ein bisschen ablenkend, mitzulesen und Linien und Linien mit schönen Klammern zu sehen und dann plötzlich mit usw. gebrochen zu werden. Mir ist klar, dass einige Dinge Punktsyntax (C-Strukturen) erfordern, aber das ist das einzige Mal, dass ich sie benutze.
Wenn Sie Code für sich selbst schreiben, verwenden Sie natürlich alles, was Sie möchten. Wenn Sie jedoch Code schreiben, den Sie für Open Sourcing planen, oder etwas schreiben, von dem Sie nicht erwarten, dass es für immer beibehalten wird, würde ich die Verwendung der Klammer-Syntax nachdrücklich empfehlen. Dies ist natürlich nur meine Meinung.
Letzter Blog-Beitrag gegen Punktsyntax: http://weblog.bignerdranch.com/?p=83
Gegenargument zum obigen Beitrag: http://eschatologist.net/blog/?p=226 (mit Originalartikel zugunsten der Punktsyntax : http://eschatologist.net/blog/?p=160 )