Frage

Ist es überhaupt sinnvoll, das „getMyValue ()“ und „setMyValue ()“ Muster von Getter und Setter, wenn alternative Funktionsnamen der API deutlicher machen zu verlassen?

Zum Beispiel vorstellen, ich habe diese Klasse in C ++:


public class SomeClass {
private:
    bool mIsVisible;

public:
    void draw();
    void erase();
}

Ich konnte Funktionen hinzufügen zu bekommen / set "mIsVisible" wie folgt aus:


bool getVisible() { return mIsVisible; };

void setVisible(bool visible) { if (!mIsVisible && visible) { draw(); } else if (mIsVisible && !visible) { erase(); }

mIsVisible = visible;

}

Allerdings wäre es ebenso möglich, die folgenden Methoden zu verwenden, anstatt:


bool isVisible() { return mIsVisible; };

void show() { 
    if (!mIsVisible) {
        mIsVisible = true;
        draw();
    }
}

void hide() {
    if (mIsVisible) {
        mIsVisible = false;
        erase();
    }
}

Kurz gesagt, ist es besser, eine einzige „setVisible (bool)“ Methode zu haben, oder ein Paar von „show ()“ und „hide ()“ Methoden? Gibt es eine Konvention, oder ist es eine rein subjektive Sache?

War es hilfreich?

Lösung

Haben Sie einen Lese des Artikels " Tell, Do not Ask " über an der Pragmatische Website Programmierer und ich denke, Sie werden sehen, dass das zweite Beispiel ist der Weg zu gehen.

Grundsätzlich sollten Sie nicht die Logik heraus durch den Code verbreiten, die mit dem ersten Beispiel impliziert ist, nämlich:

  1. aktuelle Sichtbarkeitswert erhalten,
  2. Entscheidung basierend auf dem Wert,
  3. update-Objekt.

Andere Tipps

Im Beispiel Sie gab, show() und hide() machen sehr viel Sinn, zumindest für mich.

Auf der anderen Seite, wenn Sie eine Immobilie skinPigment hatten und entschieden Sie Funktionen aufgerufen tanMe() und makeAlbino() zu machen, die eine wirklich schlecht, nicht-offensichtliche Wahl sein würden.

Es ist subjektiv, müssen Sie versuchen, die Art und Weise zu denken, die Benutzer (die Leute diese Klasse nutzen) denken. Unabhängig davon, welche Art und Weise Sie sich entscheiden, sollte es offensichtlich zu ihnen, und gut dokumentiert.

ich mit dem isVisible () / Show () / hide () Satz gehen würde.

setVisible () bedeutet, dass alle es macht es die interne Variable zu ändern. show () und hide () die Nebenwirkungen deutlich machen.

Auf der anderen Seite, wenn alle getVisible () / setVisible () tat lag bei die interne Variable zu ändern, dann haben Sie nur erstaunlich wenig verändert von ihnen als öffentliche Felder müssen.

Setter hat eigentlich sehr wenig mit Objektorientierung zu tun, die die Programmierung Idiom in dem Beispiel angewandt wird. Getter sind marginal besser, kann aber ohne in vielen Fällen gelebt werden. Wenn alles bekommen und eingestellt werden kann, was ist der Sinn ein Objekt zu haben? Operationen sollten auf Objekte aufgerufen werden, um Dinge zu erreichen, den inneren Zustand zu ändern ist nur ein Nebeneffekt davon. Das Schlimme an einem Einrichter in Gegenwart von Polymorphismus - eine der OO der Eckpfeiler - ist, dass Sie jede abgeleitete Klasse zu zwingen, einen Setter zu haben. Was passiert, wenn das betreffende Objekt ist für einen internen Zustand genannt mIsVisible keine Notwendigkeit, bekommt? Sicher kann er den Anruf ignorieren und als leer implementieren, aber dann werden Sie mit einem bedeutungslosen Betrieb verlassen. OTOH, Operationen wie Ein- und Ausblenden kann leicht mit verschiedenen Implementierungen außer Kraft gesetzt werden, ohne etwas über den internen Zustand enthüllt.

Generell denke ich Setter / Getter nur die Werte von Eigenschaften festlegen sollte. In Ihrem Beispiel ausführen Sie auch eine Aktion basierend auf dem Wert der isVisible Eigenschaft. In diesem Fall würde ich argumentieren, dass Funktionen zum Ausführen der Aktion und der Staat ist besser aktualisieren als eine Setter / Getter aufweist, die eine Wirkung als Nebeneffekt der Aktualisierung die Eigenschaft führt.

Wenn mIsVisible Schalt wirklich Sichtbarkeit des Objekts ein- und ausschaltet, sofort verwenden als das Ein- / Ausblenden-Szenario. Wenn es ein wenig länger in dem alten Zustand bleiben wird (zum Beispiel, bis etwas anderes löst ein erneutes Zeichnen), dann das Set / get Szenario wäre der Weg zu gehen.

ziehe ich die Show () und hide () Methoden, weil sie ausdrücklich sagen, was Sie wollen. Die setVisible (boolean) sagt Ihnen nicht, wenn das Verfahren sofort zeigen, wird / zeichnen. Plus-Show () und hide () sind besser genannte Methode für eine Schnittstelle (IMHO).

Implizit die ‚Show‘ und ‚verstecken‘ Funktionen, die Sie Liste sind beide Etter

Für booleans, ich würde denken, dass ein einziges Werkzeug, wie Sie wäre gut gezeigt hat. Aber auch eine .show und .Hide Funktion wie nachgucken, nicht Funktionen, die den Zustand des Objekts zu ändern.

Im Fall, dass Sie tatsächlich Code zu schreiben, wie

if (shouldBeShowingAccordingToBusinessLogic()) w.show();
else w.hide();

alle über den Platz, könnten Sie besser dran mit sein

w.showIfAndOnlyIf(shouldBeShowingAccordingToBusinessLogic())

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

w.setPostponedVisibility(shouldBeShowingAccordingToBusinessLogic());
...
w.realizeVisibility();

(Habe ich nicht sagen, es ist bizzare?)

Eine zusätzliche Motivation für die Anzeige / Verbergen der Lösung zu gehen, ist, dass als Setter,

die setVisible Methode hat eine ‚Nebenwirkung‘, dass sie auch anzeigt oder SomeClass versteckt. Die Anzeige / Verbergen der Methoden vermitteln besser die Absicht, was passiert.

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