2010-04-15 4 views
6

Im Allgemeinen ist das Erstellen einer flüssigen API etwas, das alle Programmierer glücklich macht; Sowohl für die Schöpfer, die die Schnittstelle schreiben, als auch für die Verbraucher, die dagegen programmieren. Über die Konventionen hinaus, warum stellen wir all unseren Gettern das Wort "bekommen" voran? Das Weglassen führt in der Regel zu einer flüssigeren, leicht zu lesenden Menge von Anweisungen, die letztendlich zu Glück führt (wie klein oder passiv auch immer). Betrachten Sie dieses sehr einfache Beispiel. (Pseudocode)Warum werden Getter das Wort "get" vorangestellt?

Konventionell:

person = new Person("Joey") 
person.getName().toLower().print() 

Alternative:

person = new Person("Joey") 
person.name().toLower().print() 

Dies ist natürlich nur auf Sprachen gilt, wenn Getter/Setter die Norm sind, ist aber nicht zu einem bestimmten gerichtet Sprache. Wurden diese Konventionen um technische Einschränkungen herum (Disambiguierung) oder einfach durch das Streben nach einer expliziteren, intentionalen Art von Schnittstelle entwickelt, oder ist dies nur ein Fall von Abwärtsnorm. Was sind deine Gedanken? Und wie würden einfache Änderungen an diesen Konventionen Ihre Zufriedenheit/tägliche Einstellung zu Ihrem Handwerk beeinflussen (wie gering auch immer).

Danke.

+4

einige von uns nicht schreiben Getter oder Setter oder in „fluid APIs“ glauben –

+1

ich bin nicht einverstanden, dass '... person.name() 'ist ein flüssigeres und einfacheres Set, um Anweisungen zu lesen, da ich denke, dass die Methode dieser Person tatsächlich einen Namen oder einen Spitznamen zuweist Sie beabsichtigen, es in diesem Kontext zu verwenden. 'person.name.whatever' sieht viel einfacher aus und liest sich so wie jetzt,' name' wird zu einer (lesbaren/zuweisbaren) Eigenschaft anstelle einer Methode. –

+2

so, wenn Sie und IDE mit Code-Vervollständigung haben, können Sie "get" eingeben und sehen alle Getter – colinjwebb

Antwort

10

Da in Sprachen ohne Eigenschaften name() eine Funktion ist. Ohne etwas mehr Informationen ist es nicht unbedingt spezifisch, was es macht (oder was es zurückgibt).

Funktionen/Methoden sollen auch Verben sein, weil sie eine Aktion ausführen. name() passt offensichtlich nicht zur Rechnung, weil es Ihnen nichts darüber sagt, welche Aktion es ausführt.

getName() können Sie ohne Zweifel wissen, dass die Methode einen Namen zurückgeben wird.

In Sprachen mit Eigenschaften drückt die Tatsache, dass etwas eine Eigenschaft ist, die gleiche Bedeutung aus, als hätte man sie an sie gebunden oder gesetzt. Es lässt die Dinge nur ein bisschen besser aussehen.

+0

Einverstanden. Dies fällt mit dem Fall zusammen, den ich erwähnt habe, weil ich absichtlich Dinge explizit ausdrücke, um keine Zweideutigkeit zu erzeugen. Ich bin jedoch der Überzeugung, dass eine gut gestaltete API die richtigen Namen verwenden würde, um auf diese Weise Unklarheiten zu verschleiern. Kannst du mir als Herausforderung ein Beispiel geben, in dem das Fehlen des Präfixes dazu führen könnte, dass du denkst, dass du nicht weißt, was los ist? – Joey

+0

@Joey: Das Problem mit deiner Benennungsanordnung sind nicht die Namen, sondern die Parens. Die Parens schlagen vor, eine Aktion auszuführen, anstatt den Wert einer Eigenschaft zurückzugeben. Deshalb wird das Präfix "get" benötigt. –

+0

@robert sehr gültiger Punkt. In Situationen, in denen eine solche Sprache keinen Mechanismus zum Implementieren von Eigenschaftenaccessoren oder nach der Änderung von Eigenschaften zu einer Eigenschaftsimplementierung aufweist, ist die Verwendung von parers um den nackten Namen wirklich die einzige Situation. – Joey

1

In der Schule wurde uns beigebracht, Methoden von Datenstrukturen zu unterscheiden. Ich habe nie verstanden, warum die Parens kein Hinweis sind. Ich bin der persönlichen Meinung, dass die Übernutzung von Get/Set-Methoden ein horrender Zeitverschwendung sein kann, und es ist eine Phase, die viele objektorientierte Programmierer bald nach ihrem Start durchlaufen.

+2

Ihre Schule hat es nicht richtig gemacht, IMO. –

+1

Auf der anderen Seite stimme ich Ihrer persönlichen Meinung zu. –

+0

Siehe hier für die angemessene Verwendung von Getter und Setter: http://StackOverflow.com/Questions/565095/JAVA-A-Geters-and-Setter-evil –

4

Die beste Antwort, die ich je gehört habe, die get/set-Präfixe für die Verwendung als solche:

Wenn Sie nicht sie, sowohl die Accessor und Mutator (Getter und Setter) den gleichen Namen hätte verwendet haben; somit wären sie überlastet. Im Allgemeinen sollten Sie eine Methode nur dann überladen, wenn jede Implementierung der Methode eine ähnliche Funktion (jedoch mit unterschiedlichen Eingaben) ausführt.

In diesem Fall hätten Sie zwei Methoden mit demselben Namen, die sehr unterschiedliche Funktionen erfüllten, was für die Benutzer der API verwirrend sein könnte.

+1

Schöne Beobachtung. Setter, glaube ich, verdienen sehr zu Recht das Präfix, da sie einen Zustand verändern. Es ist kein Nullsummenspiel, das Loswerden des "Get" führt nicht unbedingt zum "Setzen". Was wäre, wenn nur das Set verwendet würde und somit eine Überlastung vermieden würde? – Joey

+0

@Joey: Das hört sich nach mehr Lärm an als nur mit 'get' und' set', da man nicht wie der andere aussieht. Und Sie haben immer noch das Problem mit Parens, die vorschlagen, dass eine Aktion ausgeführt wird, anstatt eine Eigenschaft, die abgerufen werden soll. –

+0

Ich würde damit einverstanden sein, wenn die Konvention wäre, dass jede Methode, die kein Verb in ihrem Namen hatte, ein Accessor war. – danben

0

Benutzerdefiniert.

Außerdem, in C++, wenn Sie eine Referenz zurückgeben, die potenzielle Informationslecks in die Klasse selbst bietet.

+0

Wirklich? Denken Sie, dass der Operator [] von std :: string (zum Beispiel) ein solches Leck verursacht? –

+0

Neil: Ich meine nicht Speicherverlust. –

+0

Ich meinte nicht oder spreche Speicherlecks - ich meinte dein eigenes Konzept von "Leckage". –

3

Was ist mit dem Fall, in dem eine Eigenschaft nach einem Verb benannt ist?

object.action() 

Bekommt dies die Art von Maßnahmen durchgeführt werden, oder die Aktion ausführen ... get/set Hinzufügen/do entfernt die Mehrdeutigkeit, die immer eine gute Sache ist ...

object.getAction() 
object.setAction(action) 
object.doAction() 
+0

Danke für die Antwort neugierig. Können Sie mir ein Beispiel geben, in dem eine nach einem Verb benannte Eigenschaft auch logisch als Getter verwendet werden könnte? – Joey

+0

"action" ist kein Verb also ist dies ein schlechtes Beispiel. Im Allgemeinen werden Eigenschaften immer nach Substantiven und nicht nach Verben benannt. –

4

Ich schätze immer wieder get/set Präfix, wenn Sie mit einer neuen API und ihrer Dokumentation arbeiten. Die automatische Gruppierung von Gettern und Sätzen, wenn alle Funktionen in ihrer alphabetischen Reihenfolge aufgelistet sind, hilft sehr dabei, zwischen einfachem Datenzugriff und fortgeschrittener Funktionalität zu unterscheiden.

Das gleiche gilt, wenn Sie intellisense/auto completion innerhalb der IDE verwenden.

+0

Dies ist ein sehr guter Punkt, vielleicht der stärkste aus meiner Sicht. – Joey

0

Ich kann nicht viel Objective-C schreiben, aber seit ich es gelernt habe, habe ich wirklich seine Konventionen lieben gelernt. Genau das, was Sie fragen, ist addressed von der Sprache.

+1

@jsumners viele Kreise um Apple verwenden diese Konvention wirklich nicht. (* via webkit style gudie *). "Setzen Sie die Setzer mit dem Wort" set "voran. Verwenden Sie leere Wörter für Getter. Setter- und Getter-Namen sollten mit den Namen der gesetzten Variablen übereinstimmen." http://webkit.org/coding/coding-style.html. Natürlich haben bestimmte Sprachen solche Konventionen aufgegeben, weil sie Konventionen oder Sprachkonstrukte haben, um sie zu umgehen. Die Laufleistung kann variieren. – Joey

+0

Nun, ich muss C# bei der Arbeit verwenden. C# hat Eigenschaften, aber sie sind nervig (wie die ursprüngliche Frage angedeutet). Zum Beispiel wird dies nicht funktionieren:

 public class MyClass { private int foo; public int foo { get { return this.foo; } set { this.foo = value; } } } 
Stattdessen müssen Sie tun:
 public class MyClass { private int _foo; public int foo { get { return this._foo; } set { this._foo = value; } } } 
Ich denke nur, Objective-C etwas weniger ärgerlich ist in dieser Hinsicht. –

+1

Ehrfürchtig. Kommentare unterstützen kein Markup. –

1

Hier ist eine Smalltalk Antwort, die ich am meisten mag. Man muss ein paar Regeln über Smalltalk BTW kennen. Felder sind nur zugänglich, in denen sie definiert sind. Wenn Sie nicht "Accessoren" schreiben, können Sie nichts mit ihnen tun.

Die Konvention eine Variable ist, die (wir es instVar1 anme dann schreiben Sie eine Funktion instVar1 die instVar1 und instVar nur zurückgibt:.., Die den Wert setzt

Ich mag diese Konvention viel mehr als irgend etwas anderes . Wenn Sie sehen, ein. irgendwo können Sie darauf wetten, es ist eine „Setter“ in die eine oder andere Art und Weise