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?
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:
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.
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.
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.
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.
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.
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).
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.
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?)
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.
Tags und Links c++ coding-style getter setter