Wird das Hinzufügen von Logik in einem Eigenschaftssetzer als eine schlechte Vorgehensweise angesehen?

28

Ich bin in ein Projekt gesprungen und sehe, dass die anderen Entwickler den Setzern der synthetisierten Eigenschaften eine Menge Logik hinzufügen. Ich verstehe, wie das funktioniert, aber ich denke, dass es schwierig ist, den Programmfluss zu verstehen. Wenn ich den Code lese, self.something = whateverüberprüfe ich immer, ob somethingder Setter überschrieben ist.

Wie ist Ihre Meinung zu diesem Thema? Glauben Sie, dass dies ein Zeichen für eine schlechte Architektur oder eine aufwändige Lösung ist?

Ich würde mich freuen, mehr darüber zu lesen, wenn Sie relevante Links / Quellen haben. Es ist einfach zu schwierig, gute Google-Ergebnisse zu erzielen. Deshalb habe ich mich entschlossen, auch hier zu fragen.

Vielen Dank für jede Antwort. Bitte beachten Sie, dass ich über Ziel C spreche, falls Sie das Tag nicht gesehen haben (auch wenn dies meines Erachtens kein sprachspezifisches Problem sein sollte).

phi
quelle
5
Was für eine Logik? Es ist zum Beispiel nichts Falsches daran, Validierungslogik zu setzen. Andererseits ist ein Setter, der einige Ereignisse auslöst, einen Webdienst aufruft und die Benutzeroberfläche aktualisiert, völlig falsch.
Arseni Mourzenko
@MainMa Ich stimme zu, dass Validierungen in Ordnung sind - vielleicht fügen Sie auch einige Beobachter hinzu, oder? Könnten Sie vielleicht einige Beispiele dafür nennen, was Sie für angemessener halten, um einen Setter einzusetzen?
phi
Beobachter haben in der Tat recht. Was die Dinge betrifft, die für einen Setter angemessen sind, überlasse ich erfahreneren Entwicklern die Beantwortung dieser Frage.
Arseni Mourzenko

Antworten:

44

Wird das Hinzufügen von Logik in einem Eigenschaftssetzer als eine schlechte Vorgehensweise angesehen?

Nein

Eigenschaften wurden erfunden, um Klassendesignern zu ermöglichen, Logik an eine bequeme Schnittstelle für den Feldzugriff und die Zuweisung anzuhängen.

Wie viel ist zu viel? Es hängt von den Verantwortlichkeiten der Klasse ab. Hier sind einige Dinge, die sinnvoll sind, um sie in einen Eigenschaften-Setter einzufügen:

  • Aktualisieren Sie einige abgeleitete Werte
  • Benachrichtigen Sie die Beobachter, dass sich der Klassenstatus geändert hat
  • Übertragen Sie die Änderung auf ein enthaltenes Objekt
  • Übertragen Sie die Änderung an einen Hintergrundspeicher
  • Validierung durchführen

Das Programmieren ist einfacher, wenn Klassen über Schnittstellen verfügen, die verdeutlichen, was die Klasse kann, ohne dass der Aufrufer darüber nachdenkt, wie dies ausgeführt wird. Durch das Setzen der Logik hinter Eigenschaftssetzer können Klassen ihre Implementierung hinter einer einfachen Schnittstelle verbergen. Für einige Klassen sind keine Methoden erforderlich. Drehen Sie einfach die Knöpfe, indem Sie die Eigenschaften einstellen, und lesen Sie die Ausgabe, indem Sie die Eigenschaften abrufen.

Kevin Cline
quelle
13
Validierung durchführen ...
Robert Harvey
Wie gut ist es, eine Sammlungs- oder Tabellenansicht in einer überschriebenen Setter-Methode neu zu laden?
Krishnan
15

Setter werden normalerweise verwendet, um den Zustand eines Objekts ohne nennenswerte Nebenwirkungen oder umfangreiche Berechnungen zu ändern. Verwenden Sie hierfür Methoden und Funktionen. Der Hauptgrund für die Implementierung des Setters ist das Ändern und Beibehalten eines gültigen Status . Daher ist es absolut in Ordnung, den Bereich zu begrenzen, Flags zu setzen, um eine Neuberechnung anzufordern, oder verwandte Eigenschaften anzupassen.

Rob van der Veer
quelle
7

Ich weiß nicht, was Ziel C angeht, aber wie Sie sagen, scheint es eine generische Frage für jede OO-Sprache zu sein. Zuallererst und tatsächlich damit verbunden ist die Frage, ob Setter und Getter an erster Stelle stehen, umstritten (in einigen Fällen ist ihre Existenz durch die Verwendung eines Frameworks oder einer Bibliothek gerechtfertigt).

Ich glaube, dass der Name der Methode erklären sollte, was die Methode und alle Methode tut. Darüber hinaus sollte die dieser Methode zugeordnete Dokumentation sie ausführlicher beschreiben. In diesem Sinne sollte ein Methodenname in der Form "set" + {noun} keine anderen Nebenwirkungen haben als das Festlegen des Werts einer Variablen, und dies sollte die einzige damit verbundene Aktion sein. Die Überprüfung, ob das Argument gültig ist, ist akzeptabel, sollte jedoch in der Dokumentation beschrieben werden.

DPM
quelle
1
+1 für "ob Setter und Getter haben". Und ein weiteres +1 für "Methodenname sollte erklären, was es tut".
Aviv