2009-08-21 10 views
8

Ich habe festgestellt, dass die meisten Objective-C-Codierer die Syntax self->ivar niemals verwenden, wenn sie direkt auf Instanzvariablen zugreifen. Der meiste Beispielcode, den ich sehe, verweist einfach auf die Instanzvariable ohne self->. Ich denke, dass es ziemlich verwirrend ist, eine Instanzvariable zu referenzieren, ohne klar zu machen, dass es sich um eine Instanzvariable und nicht einfach um eine Variable des aktuellen Bereichs handelt.Verwendung von self> ivar beim direkten Zugriff auf Instanzvariablen

Ich fühle mich wie ich Sachen schreiben wollen wie:

- (void)dealloc { 
    [self->someVar release]; 
    [self->anotherVar release]; 
    [super dealloc]; 
} 

oder

- (void)setVar:(Foo *)newVar { 
    [self->var autorelease]; 
    self->var = [newVar retain]; 
} 

Es gibt nicht eine ganze Menge Gelegenheiten, bei denen wir immer noch unsere Instanzvariablen zugreifen sollte ein ohne Verwendung von Accessor für die Kapselung, aber manchmal müssen wir wie in Dealloc oder in benutzerdefinierten Getters und Setter.

Bin ich ein schlechter Mensch/Programmierer dafür? Gibt es wirklich gute Gründe dafür, keinen solchen Code zu schreiben? Weil es sich so gut anfühlt.

Antwort

7

Chuck ist richtig, dass es keine technische Grund gibt, sollten Sie es nicht auf diese Weise schreiben, es sei denn, Sie beschatten Ivars mit lokalen Variablen, die im Allgemeinen eine schlechte Idee ist. Es ist jedoch vertretbar, dass das Weglassen self-> stilistisch sauberer ist, und es führt sicherlich zu weniger ausführlichen Code. Persönlich würde ich die self-> als störend empfinden (vor allem, wenn der Code gut gestaltet ist und die Variablen gut benannt sind), aber wenn es die Dinge für Sie verständlicher macht, tun Sie es auf jeden Fall. Seien Sie sich jedoch bewusst, dass wenn Sie Ihren Code anderen Objective-C-Programmierern zeigen, sie wahrscheinlich eine widersprüchliche Meinung haben, also ist es gut, eine Denk-Skin zu haben. Außerdem stellen die meisten Programmierer fest, dass ihre Wahrnehmung dessen, was den Code "gut fühlen" verändert, sich im Laufe der Zeit und mit der Erfahrung ändert, und diese Meinungen werden oft mit dem Alter abgemildert. :-)

+2

Wie ich schon sagte, es ist kürzer. Ich bevorzuge es, aber ich kann nicht argumentieren, dass kürzere Bezeichner immer besser sind - ich würde es hassen, Code zu pflegen, der alles x, y und z ist. Es geht also im Wesentlichen darum, wo du dein glückliches Medium findest. Ich vermute, dass Pythonisten wahrscheinlich die 'self>' Form bevorzugen würden. Natürlich sollten Sie in Objective-C sowieso nicht viel direkten Ivar-Zugriff machen. Vielleicht ist es eine andere Tugend der "Selbst" -Syntax, unattraktiv zu sein. – Chuck

+0

Lol. "denke Haut". Ist diese Haut irgendwie dünn und dick? – Rob

7

Es gibt keinen Grund, warum Sie es nicht so schreiben sollten. Ich denke, die Leute neigen dazu, es auf die andere Art zu schreiben, weil sie sowieso vermeiden, ihre Ivars zu beschatten, also sollte es keine Unklarheit darüber geben, über welche Variable sie sprechen - und sie ist kürzer.

+0

Vielen Dank für die schnelle Antwort! –

4

Kurze Antwort: Nein, du bist deswegen kein schlechter Programmierer :) Es gibt auch keinen guten Grund dafür, Code nicht auf diese Weise zu schreiben; Die meisten Programmierer sind einfach faul oder haben nie eine anstrengende Methode in ihrem ganzen Leben geschrieben.

Lange Antwort: Wenn man auf eine Variable ohne "self>" zugreift, sucht der Compiler zuerst nach einer Variablen dieses Namens im lokalen Bereich und wenn er keine finden kann, wird die Suche mit Instanzvariablen wiederholt. Wenn dort ein Treffer gefunden wird, wird Code erzeugt, als wäre dort "self -> ..." geschrieben worden. Wenn es auch keine Übereinstimmung für Instanzvariablen gäbe, würde der Compiler innerhalb des globalen Gültigkeitsbereichs versuchen, BTW.

Die meisten Programmierer lesen nur ihren eigenen Code und sie wissen ziemlich genau, was eine Instanzvariable ist und was nicht. Sobald Sie jemals mit Code arbeiten mussten, den Sie selbst nicht geschrieben haben, wo die Methode 4 Bildschirmseiten lang ist (und ich einen Bigg-Bildschirm habe), sind Sie wirklich dankbar, wenn der Programmierer es bei jedem Variablenzugriff absolut klar gemacht hat: Ist diese Variable? ein dem Methodenaufruf zugeführter Parameter, eine lokale Variable dieser Methode, eine Instanzvariable des Objekts oder möglicherweise eine globale Variable (nur global für alle Instanzen dieser Klasse oder möglicherweise globale Anwendung). Sie sind dankbar, denn wenn es nur eine Reihe von Variablen mit ähnlichem Namen und ohne spezielle Benennungs- oder Zugriffsmuster gibt, jedoch alle unterschiedlichen Typs, verlieren Sie ziemlich schnell die Aufsicht.Und die Tatsache, dass die Xcode-Syntaxhervorhebung Instanzvariablen auf eine andere Weise als lokale Variablen hervorhebt, ist auch dumm, weil kein Programmierer Code in Xcode bearbeiten muss und selbst wenn er dies tut, könnte er ein Farbschema haben, wo es heißt Variablen haben die gleiche Farbe wie lokale.

Der Zugriff auf Instanzvariablen über self> ist vollkommen in Ordnung, aber auch ein Präfix/Suffix, das auch offensichtlich Instanzvariablen macht und auch Namenskonflikte mit Methodenparametern oder lokalen Variablen vermeidet.

1

Objective C fügt automatisch einen Unterstrich an den i-var-Namen an. Wenn Sie also "_someVar" sehen, ist es implizit Klassenbereich. Der Unterstrich ist genug eines visuellen Markers, um seinen Umfang klar zu machen, ohne selbst hinzuzufügen.

+0

Ich stimme Ihnen zu, dass Sie, wenn Sie '_someVar' in' dealloc' veröffentlicht oder in einem benutzerdefinierten Setter gesetzt haben, ziemlich sicher sein können, dass es sich um einen Ivar handelt. Aber wenn ich 'someVar' in diesen Kontexten sehe, würde ich wahrscheinlich immer noch annehmen, dass es sich um einen ivar handelt, nur einen, der manuell definiert oder manuell synthetisiert wurde (mit' @ synthesize'). Unterm Strich ist es ein bisschen stark zu sagen, dass ein führendes "_" bedeutet, dass es "implizit" ein ivar ist. Die Unterstreichung ist weder notwendige noch hinreichende Bedingung. Aber Sie haben recht, dass die beste Vorgehensweise darin besteht, Eigenschaften zu verwenden, lassen Sie Ivars für Sie synthetisieren, und sie werden den führenden Unterstrich haben. – Rob

Verwandte Themen