Frage

Ist es normal, Setter Argumente zu ändern? Stellen wir uns vor, dass wir setString Methode haben. Und wir wollen wirklich eine getrimmte Form der Saite zu halten. So ein String mit Leerzeichen ist ungültig, aber wir wollen nicht, eine Ausnahme werfen.

Was ist die beste Lösung? So schneiden Sie den Wert in der Setter z.

public void setString(String string) {
    this.string = string.trim();
}

oder schneiden Sie es in dem Anrufer (mehr als einmal) z.

object.setString(string.trim());

Oder vielleicht etwas anderes?

War es hilfreich?

Lösung

Ja. Immerhin Setter sind für diese Art von Dingen entwickelt! Um zu steuern und zu desinfizieren, die auf Felder geschriebenen Werte;)

Andere Tipps

Total. Hier ein Beispiel: Angenommen, Sie haben ein Engineering-Programme mit verschiedenen Arten von Maßeinheiten. Sie halten die internen Werte in einem Messsystem, aber Sie konvertieren von allen anderen in dem Setter, und wandeln in den Getter zurück, z.

public double UserTemperature
{
  get
  {
    return Units.Instance.ConvertFromSystem(UnitType.Temperature, temperature);
  }
  set  
  {
    double v = Units.Instance.ConvertToSystem(UnitType.Temperature, value);
    if (temperature != v)
    {
      temperature = v;
      Changed("SystemTemperature");
      Changed("UserTemperature");
    }
  }
}

Ja, sicher. Nur vorsichtig sein, für NULL zu prüfen, bevor sie eine Methode (wie trim ()) angewendet wird.

Es gibt zwei Schulen. Man sagt seine Ordnung param in Setter (Schulart) zu überprüfen und zweiten sagt Bohnen keine Logik enthalten sollten und nur Daten (Enterprise-Stil)

Ich glaube, mehr in der zweiten. Wie oft schauen Sie bei der Implementierung Ihrer Bohnen? sollte getUser jede Ausnahme werfen oder einfach nur null zurück?

Wenn Sie Logik in Ihre Setter setzen und Getter Sie machen es schwieriger, was los ist, da viele Menschen zu verstehen, wird nie auf seine Umsetzung aussehen. Wenn Sie nicht einverstanden ich fordere Dich auf jedem Setter und Getter Implementierung zu suchen, bevor Sie es verwenden, nur wenn sie nicht nur eine Bohne zu überprüfen.

Auf den ersten Blick scheint es, wie es die Prinzip der geringsten Erstaunen verletzt. Wenn ich einen User deiner Klasse bin, würde ich ein Setter erwarten genau das zu tun, was ich sage es. Ich würde eine Ausnahme in den Setter wirft Benutzer zu zwingen, um die Eingabe zu trimmen.

Die andere (bessere?) Alternative ist, den Namen der Methode zu trimAndSetString zu ändern. Auf diese Weise ist es nicht verwunderlich Verhalten der Eingabe zu trimmen.

korrigiert mich wenn ich falsch liege, aber es scheint mir logisch, dass die Setter diese Art von Logik halten sollen. Wenn der Setter gerade ist etwas Wert auf einen internen var zuweisen, ohne es überprüft, warum dann nicht aussetzen die var selbst?

Das ist genau, warum Sie Setter verwenden, anstatt die Objekte Felder der ganzen weiten Welt ausgesetzt wird.

Betrachten wir eine Klasse, die einen ganzzahligen Winkel hält, der zwischen 0 und 359 einschließlich.

zu erwarten ist

Wenn Sie das Feld aussetzen, Aufruf von Funktionen einstellen kann, was auch immer sie wollen, und dies würde den Vertrag brechen, indem Sie Ihre API angegeben. Es ist auch wahrscheinlich Ihre Funktionalität irgendwo auf der Strecke brechen, weil Ihr Code geschrieben ist ein bestimmten Bereich für diese Variable zu übernehmen.

Mit einem Setter, gibt es eine Reihe von Dingen, die Sie tun können. Eine davon ist eine Ausnahme zu heben einen ungültigen Wert, um anzuzeigen, übergeben wurde, aber das wäre meiner Meinung nach falsch sein (für diesen Fall). Es ist wahrscheinlich sinnvoller sein, wenn Sie den Eingabewert auf einen Wert zwischen 0 und 359 wie bei ändern:

actualVal = passedValue % 360;

Solange diese in Ihrer Schnittstelle (API) angegeben ist, ist es völlig in Ordnung. In der Tat, auch wenn Sie es nicht angeben, sind Sie immer noch frei, was Sie tun wollen, da der Anrufer den Vertrag verletzt hat (indem Sie einen Wert außerhalb des Bereichs vorbei). Ich neige dazu, die Regel von „sterilisieren Ihre Eingabe so schnell wie möglich“.

folgen

In Ihrem speziellen Fall, solange Sie festlegen, dass die Zeichenfolge im getrimmten Format gespeichert ist, gibt es keinen Grund für Anrufer zu beschweren (Sie haben bereits festgestellt, dass eine solche Zeichenfolge ungültig ist). Es ist besser, in Bezug auf die Codegröße (nicht Geschwindigkeit) ist es in der Setter zu tun, anstatt bei jedem Stück Code, der die Setter aufruft. Es gewährleistet auch, dass die Zeichenfolge gespeichert wird, wie Sie es erwarten -. Es gibt keine Garantie einen Anrufer nicht versehentlich (oder absichtlich) einen nicht-getrimmten Zeichenfolge speichern

Ja. Es ist ein Merkmal des objektorientierten Designs ist, dass der Anrufer Ihre Klasse als Blackbox behandeln kann. Was Sie tun, im Innern ist Ihr eigenes Geschäft, solange das Verhalten der Schnittstelle dokumentiert ist und logisch.

Während verschiedene Menschen verschiedene Philosophien haben, würde ich vorschlagen, dass Eigentum Setter nur geeignet sind, in Fällen, in denen sie einen Aspekt der den Zustand des Objekts gesetzt den angegebenen Wert entsprechen und vielleicht möglicherweise jemand mitteilen, dass über die Änderung kümmert, wird aber nicht Auswirkungen auf andere Weise den Zustand des Objekts (es ist völlig richtige für eine Eigenschaft Setter den Wert von a schreibgeschützt zu ändern Eigenschaft, wenn diese Eigenschaft in Bezug auf den Zustand definiert ist mit der Eigenschaft Setter zugeordnet, zum Beispiel, eine Kontrolle der nur-Lese-Right Eigenschaft kann in Bezug auf seine Bounds definiert werden). Property-Setter sollte eine Ausnahme auslösen, wenn sie die angegebene Operation nicht durchführen können.

Wenn man wünscht einem Client ermöglichen, den Zustand eines Objekts in irgendeiner Weise die Erfüllung der obigen Beschreibung nicht zu ändern, sollte man ein Verfahren verwenden, anstatt einer Immobilie. Wenn man Anrufe Foo.SetAngle(500) wäre es vernünftig zu erwarten, dass das Verfahren die angegebenen Parameter in Einstellen den Winkels verwenden, aber die Angle Eigenschaft könnte den Winkel in der gleichen Form nicht zurück, wie er eingestellt wurde (zum Beispiel könnte es 140 zurück). Auf der anderen Seite, wenn Angle eine Schreib-Lese-Eigenschaft ist, würde man erwarten, dass würde einen Wert von 500 Schreiben entweder oder auch den Wert verursachen würde verboten werden 500 zurück zu lesen Wenn man die Objektspeicher einen Winkel in dem haben wollte Bereich von 0 bis 359, könnte das Objekt auch eine schreibgeschützte Eigenschaft BaseAngle genannt hat, die immer einen Winkel in dieser Form zurückkehren werden.

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