Frage

ich an vielen Orten in Java (C # enthalten) bemerkt habe, dass viele „Getter“ Methoden mit „get“ vorangestellt werden, während viele andere sind es nicht. Ich habe nie bemerkt, jede Art von Muster folgend zu werden Sonne scheint. Was sind einige Richtlinien oder Regeln für die Verwendung von „get“ in Getter-Methode Namen?

War es hilfreich?

Lösung

Es kommt auf die Semantik. Ja, C # hat „Eigenschaften“, die Ihnen einen get / set ‚Methode‘ Stummel geben ... aber Funktionen (... „Methoden“, ...) in .NET Framework, die mit „Get“ beginnen zu Anhaltspunkt sollte die Entwickler in der Tatsache, dass eine Operation des Erhaltens einige Ergebnisse für den alleinigen Zweck geschieht.

Sie denken vielleicht, das ist seltsam und sagen: „warum nicht nur die Rückkehr Typ clue Menschen in benutzen?“, Und die Antwort ist einfach. Denken Sie an den folgenden Methoden:

public Person CreatePerson(string firstName, string lastName) {...}

Nur durch die Namen dieser Methode können Sie wahrscheinlich herausfinden, dass es Datenbankaktivitäten beteiligt sein, und dann eine neu geschaffene „Person“ wird zurückgegeben.

aber, was dazu:

public Person GetPerson(string firstName, string lastName) {...}

Just von , die Methode Namen, können Sie wahrscheinlich davon ausgehen, dass eine 100% ige "Safe" Abruf einer Person aus einer Datenbank durchgeführt wird.

Sie würden nie die „CreatePerson“ mehrmals aufrufen ... aber Sie sollte sicher fühlen „GetPerson“ die ganze Zeit nennen. (Es soll keinen Einfluss auf den ‚Zustand‘ der Anwendung).

Andere Tipps

„get“ und „set“ Präfix Paar in Java ist ursprünglich als Konvention verwendet Java Bean zu bezeichnen. Später es seit Java nur eine Kapselung Konvention worden, im Gegensatz zu C # nicht richtig Eigenschaften hat.

Die beste Praxis in Java ist die get zu verwenden und Präfixe für Eigenschaften festgelegt.

Frameworks, Tag-Bibliotheken, etc. für Methoden mit den Präfixen aussehen werden und sich als Objekte verwendet werden.

Also, wenn Sie eine Java-Klasse wie dieses ...

public class User{
    private String name;
    public String getName(){ return name;}
    public void setName(String name){ this.name = name; }
}

.. mit Streben-Tags (oder jede andere OGNL basierte Tag-Bibliothek), werden Sie den Namen Eigenschaft mit user.name zugreifen zu können.

Das Spring-Framework verwendet auch diese Konvention in den XML-Konfigurationsdateien.

Java nicht (noch) Unterstützung Eigenschaften. Getter und Setter sind ein bodge, dies zu umgehen. Andere Sprachen - einschließlich C # - Unterstützung Eigenschaften und Sie sollten diese stattdessen verwenden. Dies ist nicht nur ein „best practice“, was entweder:. Serialisierung in C # auf Eigenschaften beruhen, nicht Getter & Setter, also nicht Eigenschaften mit allen möglichen Problemen in der Zukunft führen könnten, wenn Sie Ihre Klassen serialisiert werden müssen

Der Vorteil Eigenschaft ist, dass sie den Code besser lesbar zu machen. So etwas wie

obj.setX(10);

in Java, wird

obj.X = 10;

Doch hinter den Kulissen ist X ein Verfahren, anstatt eine Variable zu sein und so schmutzig Eingang durchführen kann Überprüfung etc.

Ich persönlich mag die folgende Regel:

  • Mit der Vorsilbe get wenn der Wert mit einer entsprechenden set Methode direkt modifizierbar ist
  • Löschen Sie die get Präfix in Situationen, in denen der Wert etwas, das Sie nicht direkt als Eigenschaft einstellen können (das heißt, es gibt kein Äquivalent setXXX Methode)

Die Begründung für den zweiten Fall ist, dass, wenn der Wert nicht wirklich ein Benutzer einstellbaren „Eigenschaft“ als solche ist, dann sollte es kein get / set Paar Methoden benötigen. Eine Folge ist, dass, wenn diese Konvention gefolgt ist, und Sie sehen eine getXXX Methode, Sie als auch die Existenz eines setXXX Verfahren annehmen kann.

Beispiele:

  • String.length() - da Strings sind unveränderlich, Länge ist ein Nur-Lese-Wert
  • ArrayList.size() - Größenänderungen, wenn Elemente hinzugefügt oder entfernt werden, aber man kann es nicht direkt festgelegt

Es wird verwendet, sicherlich der Fall zu sein, die oft schreibgeschützte Eigenschaften ausgesetzt APIs ohne get Präfix: String.length() und sogar die neueren Buffer.capacity() vernünftige Beispiele.

Der Vorteil davon ist, dass es weniger Flaum beteiligt. Der Nachteil ist, dass alles, was die Eigenschaften automatisch auf den Konventionen zu bestimmen versucht, wird sie nicht entdecken. Persönlich I neigen auf der Seite irren das Präfix enthält.

Natürlich in C # ist es meist irrelevant, da es "echte" Eigenschaften trotzdem:)

Es hängt davon ab. Es ist oft redundante Informationen, auch in Sprachen ohne Eigenschaften.

In C ++, anstelle eines GetAttr () / SetAttr () -Paar ist es üblich, zwei Überlastungen eines Attr () Funktion zur Verfügung zu stellen: Leer Attr (Foo f); // Der Setter Foo Attr (); // Der Getter

In Java ist es gängige Praxis / set Präfix zu erhalten. Ich werde sagen, muß die beste Praxis mit zu gehen, was in Ihrer Sprache Standard ist. In Java, erwarten die Leute bekommen / set Präfixe zu sehen, so Weglassen sie Menschen verwirren könnten, auch wenn sie nicht unbedingt erforderlich sind.

Objective C 2.0 verwendet auch Eigenschaften, die gleiche Punkt-Syntax verwendet wird.

Davor, es ein etwas anderes Namensschema für Getter und Setter verwendet (was natürlich immer noch mit Eigenschaften verwendet werden, oder für einfaches altes Attribut).

value = [obj attr];

[obj setAttr:value];

[obj getAttr:&value];

Das heißt, erhält in einer anderen Art und Weise verwendet. Es gibt keinen Wert zurück, sondern speichert das Ergebnis in dem in Variable übergeben.

Der typische Getter hat die gleichen Namen wie das Attribut, ist der Setter das Attribut von Satz vorangestellt (gemäß Java-Konvention). Diese Konventionen werden verwendet, von der KVO (Key-Wert Observation System), so sollten beachtet werden.

Nur ein kurzer Nachtrag: Eine weitere Konvention für Getter der Booleschen Felder ist mit „ist“ anstelle von „get“ vorangestellt werden, z.B. bool isEnabled() { return enabled; }

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