Ist es eine schlechte Praxis, meine Getter-Methode wie Version 2 in meiner Klasse zu ändern?
Version 1:
public String getMyValue(){
return this.myValue
}
Version 2:
public String getMyValue(){
if(this.myValue == null || this.myValue.isEmpty()){
this.myValue = "N/A";
}
return this.myValue;
}
getter
Funktionen niemals den Wert des Objekts ändern. Sie können diese Prüfung in einer anderen Funktion durchführen und den Wert in einersetter
Funktion festlegen . Nur um einen klaren Code zu haben.Is it bad practice for a getter to change an object's member's value?
da es sich so anhört, als würden Sie sich fragen, ob es schlecht ist, wenn sich die interne Implementierung eines Getters ändert, auf die ich glaube, dass die Antwort Nein lautet. Es ist in Ordnung, sie zu ändern.Antworten:
Ich denke, es ist eigentlich eine ziemlich schlechte Praxis, wenn Ihre Getter- Methoden den internen Zustand des Objekts ändern.
Um das gleiche zu erreichen würde ich vorschlagen , nur Rückkehr der
"N/A"
.foo.getMyValue()
tatsächlich das Verhalten von ändernfoo
.Alternativ könnte die Übersetzung von
null
nach"N/A"
im Setter erfolgen , dh der interne Wert könnte auf gesetzt werden,"N/A"
wenn übergebennull
wird.Eine allgemeine Bemerkung:
Ich würde nur Zustände hinzufügen, beispielsweise
"N/A"
wenn sie von einer API oder einer anderen Instanz erwartet werden, die auf Ihrem Code basiert. Ist dies nicht der Fall, sollten Sie sich auf die Standardnulltypen verlassen, die Ihnen in Ihrer Programmiersprache zur Verfügung stehen.quelle
.isEmpty()
ob"N/A"
ich dagegen prüfen oder sogar als Standardwert verwenden soll (ich würde wahrscheinlich ein Nullobjekt oder eine Ausnahme bevorzugen, da der Wert / die Behandlung für den Standardfall oft von der aufrufenden Seite abhängt, nicht nur vom aufgerufenen Objekt)Meiner Meinung nach
lazy-loading
sollten Getter den Wert nicht ändern , es sei denn, Sie tun dies (was Sie in diesem Fall nicht tun ). Also würde ich entweder:Legen Sie das Wechselgeld in den Setter
Oder lassen Sie den Getter einen Standardwert zurückgeben, wenn der Wert nicht richtig eingestellt ist:
Im Fall von Lazy-Loading, wo ich sagen würde, dass es in Ordnung ist, Ihre Mitglieder in einem Getter zu ändern, würden Sie Folgendes tun:
quelle
loadMyValue
innerhalb des Getters). Das Aufrufen des Getter loadMyValue würde (meiner Meinung nach) bedeuten, dass der Wert geladen wird, egal was passiert.Du machst hier zwei Dinge. Erhalten und einstellen.
quelle
Ja. Es ist eine schlechte Praxis.
Warum?
Wenn der Wert festgelegt ist (in einer Konstruktor- oder Setter-Methode), sollte er validiert werden, nicht wenn eine Getter-Methode aufgerufen wird. Es
private
validate*
ist auch eine gute Idee, eine Methode dafür zu erstellen.Und ändern Sie bei der Getter-Methode niemals den Status des Objekts. Ich habe an einigen Projekten gearbeitet, und der Getter muss oft gemacht werden
const
: "Diese Methode kann den internen Zustand nicht ändern".Zumindest, wenn man die Dinge nicht verkomplizieren will, in der Getter - Methode, sollten Sie zurückkehren
"N/A"
, anstatt ändern interner Zustand und SatzmyValue
zu"N/A"
.quelle
Person.setHeightInCentimeters(int value)
,,Person.setHeightInMeters(double value)
undPerson.setHeightInFeetAndInches(int feet, int inches)
sollten alle eine einzige interne Darstellung gemeinsam haben, was bedeutet, dass mindestens zwei von ihnen etwas anderes als die Eingabewerte speichern.Normalerweise definiere ich eine bestimmte
getter
.Ändern Sie niemals das Original
getter
:Und erstellen Sie eine bestimmte
getter
:quelle
getter/setter
Methoden.Ich denke, es ist besser zu initialisieren
this.myValue = "N/A"
. Und nachfolgende Anrufe ansetMyValue
sollten diethis.myValue
entsprechend Ihren Geschäftsbedingungen ändern .Das
getMyValue
sollte sich in keiner Weise ändernthis.myValue
. Wenn Sie einen bestimmten Wert zurückgeben möchten, sollten Sie diesen Wert (wie "N / A") zurückgeben und nicht ändernthis.myValue
. Getter dürfen den Wert des Mitglieds nicht ändern.quelle
Ich würde die Setter-Methode besser ändern. Wenn der Wert
null
leer oder leer ist,N/A
wird er dem Attribut zugewiesen. Wenn Sie das Attribut also in anderen Methoden innerhalb der Klasse (vgtoString()
) verwenden, haben Sie dort den beabsichtigten Wert.Alternativ können Sie die Setter-Methode ändern, um eine Ausnahme zu starten, wenn der eingestellte Wert nicht richtig ist, sodass der Programmierer gezwungen ist, seine Handhabung zu verbessern, bevor er den Wert einstellt.
Davon abgesehen ist es in Ordnung.
quelle
Ich halte dies für eine schlechte Praxis, es sei denn und bis Sie den Grund erklären, warum es so notwendig ist, dass Sie das Objekt innerhalb der Getter-Methode ändern, anstatt es innerhalb der Setter-Methode zu tun.
Haben Sie das Gefühl, dass dies aus irgendeinem Grund nicht möglich ist? Könnten Sie bitte näher darauf eingehen?
quelle
Mach, was immer du willst. Immerhin sind Getter und Setter nur eine weitere öffentliche Methode. Sie können auch andere Namen verwenden.
Wenn Sie jedoch Frameworks wie verwenden
Spring
, müssen Sie diese Standardnamen verwenden, und Sie sollten niemals Ihre benutzerdefinierten Codes in diese einfügen.quelle
absolut ja, es ist eine schlechte Praxis.
Stellen Sie sich vor, Sie kommunizieren netzwerkübergreifend mit einem Drittanbieter (Remoting, COM, ...). Dies erhöht den Roundtrip und beeinträchtigt dann die Anwendungsleistung.
quelle
Ein Setter kann im Rahmen der Validierung Änderungen vornehmen, ein Getter sollte jedoch den Wert zurückgeben und die Validierung vom Aufrufer durchführen lassen. Wenn Sie tun , Validieren, dann sollte wie zu dokumentieren.
quelle
Dies hängt in hohem Maße von dem Vertrag ab, den Sie mit Ihrer get () - Methode durchsetzen möchten. Gemäß den Design-by-Contract-Konventionen muss der Anrufer sicherstellen, dass die Voraussetzungen erfüllt sind (was bedeutet, dass eine Validierung in einer Setter-Methode häufig ein schlechtes Design ist) und der Angerufene (ich weiß nicht, ob dies der richtige englische Begriff für ist) das, dh der Angerufene) stellt sicher, dass die Post-Bedingungen erfüllt sind.
Wenn Sie Ihren Vertrag so definieren, dass die Methode get () - das Objekt nicht ändern darf, brechen Sie Ihren eigenen Vertrag. Denken Sie darüber nach, eine Methode wie zu implementieren
Der Vorteil dieses Ansatzes besteht darin, dass Sie nicht überprüfen müssen, ob die Rückgabe von get () "N / A" oder etwas anderes ist. Dies kann auch vor dem Aufruf von set () aufgerufen werden, um zu überprüfen, ob Sie keine unzulässigen Werte in Ihr Objekt einfügen.
Wenn Sie einen Standardwert festlegen möchten, sollten Sie dies während der Initialisierung tun.
quelle
Zustandsänderungen bei Gettern sollten eine hängende Straftat sein. Dies bedeutet, dass der Client-Code in der Reihenfolge, in der er auf Getter und Setter zugreift, vorsichtig sein muss. Dazu muss er über Kenntnisse der Implementierung verfügen. Sie sollten in der Lage sein, die Getter in beliebiger Reihenfolge aufzurufen und trotzdem die gleichen Ergebnisse zu erzielen. Ein verwandtes Problem tritt auf, wenn der Setter den eingehenden Wert abhängig vom aktuellen Status des Objekts ändert.
quelle
Zu diesem Zweck können Sie einen Werthalter verwenden. Wie Optionale Klasse in der Guavenbibliothek.
quelle