Was ist besser geeignet: Getter und Setter oder Funktionen?

7

Ist es jemals angebracht, das "getMyValue ()" - und "setMyValue ()" - Muster von Getter und Setter aufzugeben, wenn alternative Funktionsnamen die API deutlicher machen?

Stellen Sie sich zum Beispiel vor, ich hätte diese Klasse in C ++:

%Vor%

Ich könnte Funktionen hinzufügen, um "mIsVisible" wie folgt zu erhalten / setzen:

%Vor%

}

Es wäre jedoch genauso möglich, stattdessen die folgenden Methoden zu verwenden:

%Vor%

Kurz gesagt, ist es besser, eine einzelne Methode "setVisible (bool)" oder ein Paar Methoden "show ()" und "hide ()" zu verwenden? Gibt es eine Konvention oder ist es nur eine subjektive Sache?

    
Ant 06.10.2008, 17:06
quelle

10 Antworten

13

Lies den Artikel "Sag, frag nicht " bei den Pragmatischen Programmierern Website und ich denke, Sie werden sehen, dass das zweite Beispiel der Weg ist.

Grundsätzlich solltest du die Logik nicht durch deinen Code verbreiten, der mit deinem ersten Beispiel impliziert ist, nämlich:

  1. erhält den aktuellen Sichtbarkeitswert,
  2. Entscheidung basierend auf Wert,
  3. Aktualisierungsobjekt.
Rob Wells 06.10.2008, 17:12
quelle
5

In dem Beispiel, das Sie angegeben haben, machen show() und hide() zumindest für mich sehr viel Sinn.

Andererseits, wenn Sie eine Eigenschaft skinPigment hatten und Sie beschlossen haben, Funktionen namens tanMe() und makeAlbino() zu machen, wäre das eine sehr schlechte, nicht naheliegende Wahl.

Es ist subjektiv, Sie müssen versuchen zu denken, wie Ihre Benutzer (die Leute, die diese Klasse benutzen) denken. Wie auch immer Sie sich entscheiden, es sollte für sie offensichtlich und gut dokumentiert sein.

    
Adam Bellaire 06.10.2008 17:08
quelle
3

Ich würde mit dem isVisible () / show () / hide () Set gehen.

setVisible () bedeutet, dass nur die interne Variable geändert wird. show () und hide () machen die Nebenwirkungen klar.

Wenn andererseits getVisible () / setVisible () war, um die interne Variable zu ändern, dann haben Sie sich nur bemerkenswert wenig davon geändert, sie als öffentliche Felder zu haben.

    
James Curran 06.10.2008 17:39
quelle
3

Setter haben eigentlich wenig mit der Objektorientierung zu tun, das ist die Programmiersprache, die im Beispiel angewendet wird. Getters sind marginal besser, aber können in vielen Fällen ohne gelebt werden. Wenn alles zu bekommen und zu setzen ist, was ist der Zweck, ein Objekt zu haben? Operationen sollten auf Objekte angewendet werden, um Dinge zu erreichen, die Änderung des internen Zustands ist nur ein Nebeneffekt davon. Das Schlimme an einem Setter bei Polymorphie - einem der Eckpfeiler von OO - ist, dass Sie jede abgeleitete Klasse zwingen, einen Setter zu haben. Was, wenn das betreffende Objekt keinen internen Zustand namens mIsVisible benötigt? Sicher kann er den Anruf ignorieren und als leer implementieren, aber dann bleibt dir eine sinnlose Operation. OTOH, Operationen wie show and hide können leicht mit verschiedenen Implementierungen überschrieben werden, ohne etwas über den internen Zustand zu enthüllen.

    
QBziZ 06.10.2008 17:48
quelle
2

Im Allgemeinen sollten Setter / Getter nur die Werte von Eigenschaften festlegen. In Ihrem Beispiel führen Sie außerdem eine Aktion basierend auf dem Wert der isVisible-Eigenschaft durch. In diesem Fall würde ich argumentieren, dass die Verwendung von Funktionen zum Ausführen der Aktion und zum Aktualisieren des Status besser ist als ein Setter / Getter, der eine Aktion als Nebeneffekt der Aktualisierung der Eigenschaft ausführt.

    
tvanfosson 06.10.2008 17:20
quelle
2

Wenn das Schalten von mIsVisible die Sichtbarkeit des Objekts wirklich sofort ein- und ausschaltet, verwenden Sie das show / hide-Szenario. Wenn es länger im alten Zustand bleibt (z. B. bis etwas anderes ein Neuzeichnen auslöst), wäre das Set / Get-Szenario der richtige Weg.

    
Treb 06.10.2008 17:23
quelle
1

Ich bevorzuge die Methoden show () und hide (), weil sie explizit sagen, was Sie tun. Das setVisible (boolean) sagt Ihnen nicht, ob die Methode sofort zeigen / zeichnen wird. Plus show () und hide () sind besser benannte Methode für eine Schnittstelle (IMHO).

    
Julien Grenier 06.10.2008 17:20
quelle
0

Implizit sind die Funktionen 'show' und 'hide', die Sie auflisten, beide Setter

Für Booleans würde ich denken, dass ein einzelnes Tool, wie du es gezeigt hast, gut wäre. Eine .show- und eine .hide-Funktion sehen jedoch genauso aus wie Befehle, keine Funktionen, die den Status des Objekts ändern.

    
warren 06.10.2008 17:11
quelle
0

Für den Fall, dass Sie tatsächlich Code wie

schreiben müssen %Vor%

überall, Sie könnten mit

besser dran sein %Vor%

Oder, für wirklich bizarre Fälle, wenn Ihre Logik nicht entscheiden kann, ob Sie bis zum Ende einer Code-Strecke dehnen oder nicht, können Sie versuchen

%Vor%

(Habe ich nicht gesagt, es ist Bizzare?)

    
Arkadiy 06.10.2008 18:05
quelle
0

Eine zusätzliche Motivation für die Anzeige / Ausblenden-Lösung ist, dass Sie als Setter,

Die Methode setVisible hat einen Nebeneffekt, indem sie SomeClass ebenfalls anzeigt oder ausblendet. Die Anzeige / Verbergen-Methoden vermitteln besser die Absicht, was passiert.

    
andreas buykx 06.10.2008 18:06
quelle

Tags und Links