In welcher Reihenfolge werden Getter und Setter definiert? [geschlossen]

12

Gibt es eine bewährte Methode für die Reihenfolge, in der Getter und Setter definiert werden? Es scheint zwei Praktiken zu geben:

  • Getter / Setter-Paare
  • Erst Getter, dann Setter (oder umgekehrt)

Um den Unterschied zu verdeutlichen, hier ein Java-Beispiel für Getter / Setter-Paare:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Und hier ist ein Java-Beispiel für first getters, then setters:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Ich denke, die letztere Art der Bestellung ist sowohl im Code als auch in den Klassendiagrammen klarer, aber ich weiß nicht, ob dies ausreicht, um die andere Art der Bestellung auszuschließen.

NN
quelle

Antworten:

7

Der erste Weg. Wenn es möglich ist, gruppieren Sie sich immer zusammen oder halten Sie sich in der Nähe von verwandten Funktionen, die an denselben Mitgliedern arbeiten.

Wenn Sie Ihren Code auf diese Weise anordnen, wird die Umgestaltung klarer und einfacher. Wenn eine Klasse aus einer anderen herausgerechnet werden kann, die zu viel bewirkt, dreht sich das faktorisierbare Teil normalerweise um eine bestimmte Elementvariable.

Im Allgemeinen ist es einfacher, Code zu debuggen, zu verstehen und zu manipulieren, wenn Sie den gesamten Lebenszyklus eines Objekts / einer Variablen auf derselben Seite sehen können. Ich würde so weit gehen zu sagen, dass Code-Layout, das hauptsächlich auf Oberflächlichkeiten wie Umfang und alphabetischer Reihenfolge basiert, tatsächlich bedeutet, dass Sie Möglichkeiten zur Umgestaltung verpassen, weil Sie sie nicht sehen können.

Benedikt
quelle
Möchten Sie weitere Argumente dafür anführen, warum Funktionen, die auf denselben Mitgliedern ausgeführt werden, zusammengehalten werden sollten?
NN
Einige Gründe hinzugefügt.
Benedikt
25

Wenn Sie in einem Team sind, tun Sie das, was sie normalerweise tun. Andernfalls wählen Sie einfach die aus, die Ihnen besser gefällt. Auf der Skala wichtiger Designentscheidungen ist dies wahrscheinlich in der Nähe von "Mit welchem ​​Daumen soll ich die Leertaste drücken?".

axblount
quelle
7
Stimme voll und ganz zu. Dies fällt unter die Überschrift "Schwitzt nicht die Kleinen", die jedermanns Kodierungsstandardregel Nr. 0 sein sollte (Es ist Regel Nr. 0 in "C ++ - Kodierungsstandards" von Herb Sutter und Andre Alexandrescu.)
David Hammen
Ich bin sicher, die Leute haben viel darüber
gestritten, mit
@Michael Ich bin auch ein richtiger Thumber. Ich habe versucht, ausschließlich meine linke zu verwenden, aber es war extrem schwierig und meine Eingabe wurde langsamer.
Axblount
@axblount Ich bin Rechtshänder, benutze aber immer meinen linken Daumen. Habe gerade mein Recht ausprobiert und die gleiche Erfahrung gemacht, die du beschrieben hast. Ich tippe aus irgendeinem Grund auch "y" mit meiner linken Hand.
KChaloux
6

Dies kann auch von der Sprache abhängen. In Java gibt es keinen wirklichen Vorteil für eine der beiden Reihenfolgen, aber in C # haben Sie zum Beispiel das Konzept von "Eigenschaften", die den Getter und den Setter zusammenfassen, sodass diese Reihenfolge erzwungen wird. In einer Sprache wie C ++, in der Sie möglicherweise eine andere Sichtbarkeit für Getter als Setter wünschen (z. B. Private Setter, Public Getter), würden Sie wahrscheinlich das Gegenteil tun, da der Sichtbarkeitsmodifikator für mehrere Methoden einmal und nicht für jede Methode einzeln angegeben wird .

Darrel Hoffman
quelle
4

Soweit ich weiß, gibt es keine einzige Konvention. Im Abschnitt Oracle Java Code Conventions zur Dateiorganisation wird die Platzierung von Gettern und Setzern nicht explizit erwähnt, es heißt jedoch:

Diese Methoden sollten nach Funktionalität und nicht nach Umfang oder Zugänglichkeit gruppiert werden.

Dies ist keine Anleitung - ich könnte argumentieren, dass beide Platzierungen diese Kriterien erfüllen.

Zu berücksichtigen ist, dass Sie mit modernen IDEs abstraktere Ansichten der Struktur Ihrer Dateien erhalten als mit der textuellen Codekomponente. Zusammen mit leistungsstarken Suchwerkzeugen sollte dies das Navigieren in Dateien und das Auffinden der entsprechenden Methoden auch in großen Dateien vereinfachen.

Eclipse bietet beispielsweise eine Gliederungsansicht, in der Sie Methoden und Felder auf verschiedene Arten sortieren und filtern und direkt zu den Positionen in Dateien navigieren können. NetBeans hatten eine ähnliche Funktionalität, und ich würde vermuten, dass die meisten anderen IDEs dies auch tun.

Dies ist möglicherweise nur dann von Bedeutung, wenn Sie den Code außerhalb Ihrer IDE lesen. Ein Beispiel ist die Verwendung eines externen Tools zur Codeüberprüfung oder das Anzeigen von Deltas in Ihrem Versionskontrollsystem.

Die beste Lösung wäre, einfach über alle Dateien in einem Projekt hinweg konsistent zu sein. Suchen Sie einen Standard, dokumentieren Sie ihn und halten Sie sich daran.

Thomas Owens
quelle
1

Gruppieren Sie den Getter und Setter für ein einzelnes Feld paarweise.

Das Gruppieren aller Getter und Setter macht es schwierig zu sagen, welche Felder nur Getter oder nur Setter haben.

Wenn ich Code lese oder nach einer bestimmten Funktionalität suche, stelle ich mir eine Klasse mit Feldern vor, wobei jedes Feld einen Getter und einen Setter hat. Es macht für mich keinen Sinn, dass eine Klasse eine Get-Gruppe und eine Set-Gruppe hat, die jeweils Felder haben.

M. Dudley
quelle
Sie argumentieren also, dass Getter für ein Feld mit Getter für dieses Feld gepaart werden sollten, da dies die Übersicht über den Umgang mit bestimmten Feldern in einer Klasse erleichtert?
NN
Das und das konzeptionelle Modell dessen, was eine Klasse ist. Der Unterricht sollte in erster Linie nach Funktionen organisiert werden. Wenn Sie eine Klasse erstellen, müssen Sie möglicherweise ein öffentlich sichtbares, veränderbares Feld angeben. Das ist die begriffliche "Funktionalität", nicht der syntaktische Ausdruck durch Getter- und Setter-Methoden.
M. Dudley
0

Jede Java-IDE kann Getter und Setter für Sie generieren. Verwenden Sie einfach diese Funktionalität und lassen Sie die Reihenfolge der Methoden so, wie sie von der IDE erstellt wurden. Dies ist generierter Code, berühren Sie ihn nicht unnötig.

user281377
quelle
Ich bin mir dessen bewusst. Sie können jedoch zB in Eclipse zwischen verschiedenen Ordnungen wählen .
NN
Richtig. Die Standardoption "Felder in Getter / Setter-Paaren" erscheint sinnvoller, da Sie später weitere Felder hinzufügen und weitere Accessoren generieren können, ohne sich Gedanken darüber machen zu müssen, welche Methode wohin führt. Fügen Sie einfach beide am Ende ein.
User281377