Frage von ReginaSuperSofi, 70

Getter & Setter immer in der Erstellung einer Klasse schreiben?

Eine ganz allgemeine Frage, muss man in einer Klasse ob in C, C++, C# oder anderen Sprachen immer Getter und Setter schreiben um eine absolut korrekte Synatx zu erhalten? Also auch bei Variablen die extern der Klasse weder lesbar noch setzbar seien sollen.

Antwort
von PWolff, 37

Nein, es gibt auch nur lesbare Eigenschaften. (Und sogar nur schreibbare Eigenschaften, aber ich halte das für sehr schlechten Stil.)

(Und dann kannst du auch öffentliche Felder deklarieren. Die werden intern in private Variablen mit öffentlichen Getter und Setter umgesetzt.)

Kommentar von CrystalixXx ,

Ich habe in meiner ganzen Zeit der Programmierung noch nie einen (sinnvollen) Verwendungszweck für eine WriteOnly-Eigenschaft gefunden. Ich fand bisher einfach keinen Grund / Nachteil, weshalb ich die entsprechende Eigenschaft nicht auch lesbar machen sollte.

Ich halte WriteOnly daher für überflüssig. Aber vielleicht kennt jemand eine sinnvolle Möglichkeit. Ich bin gespannt! : )

Kommentar von PWolff ,

Eine sinnvolle Möglichkeit für Write-Only-Eigenschaften ist mir auch noch nie begegnet, seit ich vor 3 Jahrzehnten das erste Mal Eigenschaften begegnet bin.

Begegnet ist mir das das erste Mal in VBA, aber da habe ich mich auch immer gefragt, warum zum Henker man die Eigenschaft nicht auch auslesen können sollte bzw. warum man nicht eine gewöhnliche Prozedur (Sub in VB(A), gewöhnliche Methode mit Rückgabewert void in C-flavored Sprachen) verwendet.

Ein Setter ohne Getter ist ja in jeder Hinsicht äquivalent einer solchen Prozedur ohne Rückgabewert mit einem Argument vom "Typ" der "Eigenschaft". Mit Ausnahme der Syntax. Vermutlich hat da jemand entweder ursprünglich mal vorgehabt, eine auch auslesbare Eigenschaft zu haben, oder fand einfach "Einstellung = Wert" hübscher als "SetzeEinstellung (Wert)".

Wo public write, private read einen Sinn hat, ist bei Nachrichten. Ich habe nichts dagegen, dass meine Bekannten mir E-Mails schreiben, aber ich hätte es wirklich nicht gern, wenn sie an mich gerichtete E-Mails auch lesen könnten. Aber E-Mails sind keine Eigenschaften.

Kommentar von CrystalixXx ,

Anstatt einer WriteOnly-Eigenschaft würde ich wohl auch eher eine Methode ohne Rückgabewert verwenden.

Eine Möglichkeit für WriteOnly ist mir eingefallen: zum Hinterlegen eines Passwortes. Zwecks Sicherheit sollte das Passwort verschlüsselt einer Klasse übergeben werden können, aber man sollte es nicht auslesen können. Aber auch dann würde sich meinem Gefühl nach auch eher eine Methode "SetPassword" anbieten. Na ja.

Vermutlich hat sich da jemand gedacht "wenn wir schon ReadOnly haben, dann der Vollständigkeit wegen auch WriteOnly - so wie Addieren und Substrahieren oder Gleichheit und Ungleichheit".

Antwort
von kingbongo, 26

Nein, man muss gar nix. Es hängt immer vom speziellen Kontext ab wo eine Implementierung von getter/setter Sinn macht. Manchmal ist es auch einfach nur eine Stilfrage. In einem Domain Model welches an eine konkrete Datenquelle gemapped wird ist eine Implementierung von getter und setter Methoden in der Klasse üblich um einen Einfluss auf die Properties zu nehmen. 

Antwort
von MalNachgedacht, 29

Mit settern will man eigentlich erreichen, dass der Zustand eines Objekts "von außen" nicht unkontrolliert verändert werden kann (indem man bei den settern entsprechende Prüfungen vornimmt)

Mit gettern erreicht man, das die externen Nutzer der Klasse nicht auf implementierungspezifische Dinge wie meist Membervariablen zugreifen - und man die Implementierung dadurch gefahrlos ändern kann.

Getter und Setter haben darüberhinaus auch einen Dokumentationseffekt - ein Verwender der Klasse weiß an welchen "Schrauben" er drehen darf und soll.

Innerhalb der Klasse ist das weniger bedeutend - zumal man den Zugriff von Methoden auf Membervariablen sowieso nicht verhindern kann.

Manchmal machen getter und setter trotzdem auch "intern" Sinn - wenn  man jede Änderung der Variable "kontrollieren" will oder bei Gettern eine Variable erst dann initalisieren möchte wenn zum ersten Mal auf sie zugegriffen wird - aber nicht so eindeutig ist wann und ob das das passiert.

Mit korrekter Syntax hat das nichts zu tun - syntaktisch korrekt kann ein Programm auch dann sein wenn es komplett auf Getter und Setter verzichtet.

Antwort
von janwelter, 44

Nein es werden nur getter und setter erstellt die einen Sinn haben

Kommentar von ReginaSuperSofi ,

Laut Definition einer Klasse oder laut "Programmierer Faulheit"? Ich kann alle Setter und Getter auf private setzen, dann habe ich was ich will, aber wozu dies machen falls ich weiterhin laut Definition korrekt bin und diese weglassen kann.


 

Kommentar von janwelter ,

Private Getter und Setter haben ja keinen logischen Sinn.

Kommentar von TeeTier ,

Naja, eigentlich schon. Zumindest auf jeden Fall private Setter. Private Getter weniger, aber dafür gibts auch sinnvolle Einsatzzwecke. :)

Kommentar von triopasi ,

Getter und Setter sind normale Methoden. Schreibst ja sonst auch keien sinnlosen Methoden, oder?

Antwort
von triopasi, 43

Willst du oder fragst du ob du das machen sollst?

Kommentar von ReginaSuperSofi ,

Der Text wurde vorhin nicht übernommen und musste diesen neu schreiben

Kommentar von triopasi ,

Ah okay. Nein musst du nicht und sollst du auch nicht! Attribute die nicht direkt änderbar/abrufbar sein sollen bekommen keine getter/setter.

Keine passende Antwort gefunden?

Fragen Sie die Community