Frage

Tut dies, rankle jemand anderes da draußen?Ich würde viel lieber sehen:

 block.key(newKey);  // set the key for this block

und

 testKey = block.key();  // look up the key for this block

als

 block.setKey(newKey); // set the key for this block
 testKey = block.getKey(); // look up the key for this block

Zuerst die "set" und "erhalten" sind überflüssig (und damit Lärm reduzieren die Lesbarkeit zu verbessern).Die Aktion (set/get) ist definiert durch die syntax der einzelnen Anweisung.Ich verstehe die überlastung.In der Tat, mit dem gleichen Bezeichner verstärkt, dass dies die gleiche Eigenschaft des Objekts.Wenn ich lese "getKey()" und "setKey()" ich kann nicht so sicher sein.

Zweite, wenn "get" und "set" sind strikt interpretiert, als setter-und getter -, dann, wenn die anderen semantischen Zusammenhang mit dem setzen/immer ein Wert, Nebenwirkungen, zum Beispiel, wird es überraschend sein.

Ich nehme an, dieses Vorurteil stammt aus meinem Smalltalk hintergrund, aber in einer Welt, in der Polymorphismus funktioniert, wäre wir nicht besser dran ohne die "get" und "set" bestreut überall?Denken Sie nur, wie viel mehr code, den wir schreiben, wenn wir das nicht haben, um geben Sie die drei Buchstaben immer und immer wieder?!(Zunge etwas in der Wange)

Jemand da draußen fühlen die gleiche Weise?

War es hilfreich?

Lösung

Indem Accessoren, die mit "bekommen" und Mutatoren mit "set" ist eine Praxis, variiert von Sprache zu Sprache, und scheint zu sein, meist weit verbreitet in Java.Zum Beispiel:

  • In Python, Sie haben das Konzept der Eigenschaften, und so einen accessor Aussehen könnte obj.foo und mutator Aussehen könnte obj.foo = bar (auch wenn Methoden aufgerufen werden, die hinter den kulissen).Ähnliche Konzepte existieren, die in Sprachen wie Ruby.So in a lot of languages, Anrufe zu Accessoren und Mutatoren Aussehen wie direkt "anrufen", um Instanz-Variablen, und Sie sehen nie so etwas wie "setFoo" oder "getFoo".
  • Sprachen wie Objective-C zu entmutigen die Praxis, indem Accessoren mit "Holen", also in Objective-C, die Sie sehen würden, wie Anrufe [obj foo] und [obj setFoo:bar].

Ich mochte nie die Praxis, indem Accessoren in Java mit "bekommen", aber ich sehe das Verdienst, indem Mutatoren mit "set".Das heißt, da die vorherrschende Praxis ist, Präfix mit "get"/"set" in Java, dass ich weiterhin den trend in meinem eigenen code.

Andere Tipps

Die Designer von C# anscheinend Stimmen, und die 'C#' tag outnumbers die nächste beliebteste Sprache, die von 2:1 auf StackOverflow.Also ich vermute, du bist zum Chor predigen.

Mehrere Sprachen, haben unterschiedliche Wege im Umgang mit Getter und setter.In Java müssen Sie getName und setName, Qt-Sie haben Namen und setName.Ich bevorzuge die Java-Art, aus diesen Gründen:

  1. Was ist, wenn Sie haben eine Funktion, die aufgerufen wird, zu fahren?Verursacht Ihre Klasse zu fahren, oder hat Sie die set/get-Laufwerk?
  2. Mit Anregungen gedreht auf, Sie können geben, und dann Holen Sie sich alle Getter.Dies ist sehr nützlich, wenn Sie sich nicht erinnern die Namen der getter, die Sie brauchen.
  3. Gebäude auf Grund einer, es trennt die Funktionen in verschiedene Gruppen.Sie haben die Funktionen, die etwas tun, die Sie nicht beginnen mit get-oder set (wenn auch vielleicht Sie sollte mit machen?).Dann haben Sie die Funktionen, erhalten Sie eine Eigenschaft, und Sie beginnen alle mit bekommen.Dann haben Sie die Funktionen, die eine Eigenschaft festlegen, und Sie beginnen alle mit set.

Für mich, get und set Präfixe mein Gehirn, weniger Arbeit beim Lesen von code.Wenn verwendet konsequent, get/set Methoden machen es einfacher zu grep-a header, eventuell die Klasse leichter zu lernen und zu nutzen.Ich verbringe ein unverhältnismäßig großen Aufwand an Zeit mit dem Lesen von code vs.das schreiben von code, so dass das zusätzliche Zeichen für get und set sind für mich in Ordnung.

Der Java-Sprache sind derzeit keine Eigenschaften haben, so dass die getter / setter syntax hat sich zum de-facto-standard.Wenn Ihr das schreiben von Java-code, werden Sie auch serviert, um die Nutzung der Java-Konvention.Dies ist nicht nur so dass andere Programmierer können Lesen Ihre Codes, aber vor allem Hunderte von anderen Java-frameworks sind gebaut, um die Handhabung von Gegenständen unterstützt Java-Bean Stil Getter / setter.

Für Beispiel, in die Velocity Template engine, könnten Sie etwas schreiben wie:

The answer is $block.key

Die oben wird beim aufrufen:

block.getkey();
block.getKey();

Wenn Sie definiert haben, blockiert.getKey(), dann wird alles gut funktionieren.In der Regel ist es am besten zu Folgen, die Konventionen der Sprache.

Im Allgemeinen Eigenschaft sollten die Namen werden Substantive in der Erwägung, dass Methodennamen sollten Verben, also die Immobilie in das obige Beispiel würde als 'Treiber' und die Methode 'fahren'.Natürlich gibt es auch Fälle, in denen es zu überschneidungen, aber im Allgemeinen funktioniert dies und macht den code besser lesbar.

In C++ habe ich einfach überladen

int parameter() const { return m_param }
void parameter(int param) { m_param = param; }

Ja, die get/set-in java ist im wesentlichen eine Problemumgehung ein problem in der Sprache.

Vergleich zu c# - Eigenschaften

http://www.csharp-station.com/Tutorials/Lesson10.aspx

Oder python http://blog.fedecarg.com/2008/08/17/no-need-for-setget-methods-in-python/

Ich denke, dies ist einer der größten Mängel von java.

C# Getter und setter sind "first class" - Entitäten und entsprechen nicht Funktionsaufrufe syntaktisch (obwohl jeder beliebigen code ausführen können, im Rahmen einer accessor).

Ich nur get - /set-in Sprachen, die Kraft mir zu, wie Objective-C.

Können Sie leicht suchen Sie Ihre Codebasis für Verweise auf getDrive() oder setDrive().Wenn Ihre Methode ist nur mit der Bezeichnung "drive" erhalten Sie viele weitere false-positives bei der Suche.

Hört, hört.

Ich mag Besondere notation für die Getter und setter.CLU Tat dies am besten:

  • Verwendung p.x in einem Ausdruck entspricht den Anruf get_x(p).

  • Verwendung p.x := e (Abtretung) war gleichbedeutend mit dem Aufruf set_x(p, e).

Wenn die Schnittstelle für das Objekt p nicht exportieren get_x oder set_x, Sie wurden daran gehindert, den entsprechenden Vorgang.Einfach.

Hören wir es für syntaktischen Zucker!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top