Design ohne Getter und Setter

Status
Nicht offen für weitere Antworten.

deamon

Bekanntes Mitglied
Hallo,

ich habe den Artikel Why getter and setter methods are evil gelesen und kann nachvollziehen, dass es schlechte Praxis ist, intern verwendete Datentypen über get- und set-Methoden zugänglich zu machen. Der Autor argumentiert, dass dieses Muster nur für die Werkzeugunterstützung eingeführt, damit man etwa beim Zusammenklicken einer GUI gleich sieht, an welchen Parametern man drehen kann.

Der Autor bringt ein Beispiel, wo man statt "String getId()" lieber eine Methode implementieren soll, die das tut, was man sonst außerhalb mit dem Feld "login" tun würde, beispielsweise "drawYourself()", das die Darstellung übernimmt. Damit ist anderer Code nicht davon abhängig, dass die ID ein String ist, es könnte auch ein Foto oder sonstwas sein. Nun merkt er aber selbst an, dass er damit GUI-Code in sein Domänenmodell bringt, bestreitet aber sogleich, dass er das tatsächlich tut, weil die eigentliche Darstellung ja mit AWT oder Swing außerhalb stattfinden würde. Er schreibt, dass der das Problem mit möglicherweise wechselnden GUIs dadurch lösen könnte, dass er eine "give-me-a-JComponent-that-represents-your-identity class" einführt. Bloß damit wäre die eigentliche Klasse ja immer noch von z. B. Swing abhängig, was ich nicht besonders schön finde.

Wenn ich an verschiedene Frameworks wie Spring MVC oder Wicket denke, fällt mir kaum ein sinnvoller weg ein, wie man die Darstellung der Klasse überlassen sollte. In Wicket würde man wohl eine Wicket-Komponente zurückegeben. Aber in Spring MVC könnte man keine GUI-Komponente zurückgeben, man müsste wohl HTML erzeugen. Aber selbst wenn man das täte, bliebe das Problem, wie die Werte aus einem Formular dann zurück in das Objekt kommen?

Bei dem klassischen Fall mit Gettern und Settern, werden z. B. in Wicket die Zugriffsmethoden der jeweiligen Felder aufgerufen, um die Formularwerte zu übernehmen. Wie sollte das ohne Getter und Setter laufen?
Code:
public class Person {

	private String nachname, vorname, email, strasse, plz, ort;
	
	public String getNachname() {return nachname;}
	public void setNachname(String nachname) {this.nachname = nachname}
	// usw ...
	
}

Der Autor bringt noch Reflection und die Annotation @Property (gibt es die offiziell?) ins Spiel. D.h. man könnte alle Felder "private" machen und wenn ein Formular abgesendet wird, die Daten per Reflection direkt in die Felder schreiben. Bloß das ändert an dem Problem ja nichts. Wenn ein Feld ein boolean ist, muss aus dem Formular auch ein boolean kommen. Und wenn das boolean-Feld irgendwann in eine Enumeration umgewandelt wird, muss man die Stelle wo der Wert gesetzt wird, genauso ändern, wie man es mit einem Setter tun müsste.

Wie würde man das in SmallTalk machen? Ich habe gelesen, da bräucht men sowas wie Getter und Setter dank des Nachrichtenkonzepts nicht. Hier ist ein Beispiel in Ruby, aber beantwortet nicht die Frage, wie Werte gesetzt werden:
http://www.java-forum.org/allgemeine-java-themen/47023-getter-und-setter.html

So reizvoll ich die Idee finde, ohne Getter und Setter zu programmieren, mir fällt kein vernünftiger Weg ein, das tatsächlich zu tun. Seht ihr einen Weg?
 
M

maki

Gast
Das Problem ist kei GUI spezifisches sondern ein allgemeines.

Ganz ohne Getter und Setter ist ja auch übertrieben.
Das eigentliche Problem wenn man nur "dumme" POJOs einsetzt ohne echte Logik aber dafür mit Gettern&Settern für alle Felder ist ein grundlegendes mit der OO: Encapsulation & Information hiding
Ersteres wird durch Getter & Setter erfüllt, letzteres wird gebrochen wenn man einfach alle internas per getter & setter zugänglich macht.
Anstatt einfach für alles Getter&Settern zu erstellen kann man sich ja vernünftige Schnittstellen überlegen, inkl. Delegation etc.

Sog. "trainwrecks", also zugriffe tief in den Objektgraphen hinein (object1.getObject2().getObject3().getObject4().doSomething) sind kein gutes Design, denn hier gibt es kein Information Hiding und der aufrufer muss die internas von object1, object2, object3 und object4 kennen und ist natürlich abhängig von diesen, jede Änderung wirkt sich auf den Clientcode aus.
Das sog. Law of Demeter wird gebrochen: Law of Demeter - Wikipedia, the free encyclopedia
 

tfa

Top Contributor
Verteufeln würde ich Getter und Setter nicht, man muss sie vernünftig einsetzen.
Ich kann mich erinnern, diesen Holub-Artikel mal vor Jahren gelesen zu haben. In den Kommentaren wurde seine Thesen kontrovers diskutiert, um nicht zu sagen runter gemacht. Leider scheinen die Kommentare irgendwann gelöscht worden zu sein. Das was da jetzt steht, ist jedenfalls fast 6 Jahre älter als der Artikel. Schade.

Wie würde man das in SmallTalk machen? Ich habe gelesen, da bräucht men sowas wie Getter und Setter dank des Nachrichtenkonzepts nicht. Hier ist ein Beispiel in Ruby, aber beantwortet nicht die Frage, wie Werte gesetzt werden:
In Smalltalk ist alles Public, da braucht man keine Accessoren.
Ruby bietet so tolle Sachen wie Mix-Ins, womit man seine Klassen und Objekte im Bedarfsfall erweitern kann. Je nachdem was man braucht, importiert man sich dann eben Methoden zur Anzeige unter Swing oder AWT oder SWT etc. Das ist ein ziemlich mächtoges Konzept, was sich in statischen Sprachen wie Java so nicht umsetzten lässt.
 
Zuletzt bearbeitet:

deamon

Bekanntes Mitglied
In Smalltalk ist alles Public, da braucht man keine Accessoren.

Aber wie funktioniert der Zugriff auf diese öffentlichen Felder? Wenn ich in SmallTalk eine Klasse "Person" mit Vor- und Nachname usw. habe und diese Werte von außen direkt zugänglich sind, habe ich doch das gleiche Problem, wie in Java wenn man alles public macht, oder nicht?

Ruby bietet so tolle Sachen wie Mix-Ins, womit man seine Klassen und Objekte im Bedarfsfall erweitern kann. Je nachdem was man braucht, importiert man sich dann eben Methoden zur Anzeige unter Swing oder AWT oder SWT etc. Das ist ein ziemlich mächtoges Konzept, was sich in statischen Sprachen wie Java so nicht umsetzten lässt.

Mixins gibt es in Java zwar nicht, aber man könnte etwas Vergleichbares relativ leicht mit dem Strategiemuster umsetzen. Aber das ist wieder ein neues Thema, was nichts mehr mit Gettern und Settern zu tun hat ...
 

tfa

Top Contributor
Nein, das ist weit davon entfernt, was Ruby (oder auch andere Sprachen) unter Mix-Ins verstehen. In Java kann man das höchstens umständlich simulieren, z.B. mit AOP.
 

faetzminator

Gesperrter Benutzer
Ich verstehe nicht, warum man auf Getters und Setters verzichten will. In diesen Methoden müssen manchmal auch Validierungen gemacht oder andere Felder oder was auch immer updated werden. Was macht man, wenn man in einer neuen Programmversion plötzlich etwas zusätzliches aufrufen will, aber eine public Variable hat? Diese auf @deprecated setzen und dann Getter und Setter implementieren? Macht IMHO keinen Sinn.
 
M

maki

Gast
Ich verstehe nicht, warum man auf Getters und Setters verzichten will. In diesen Methoden müssen manchmal auch Validierungen gemacht oder andere Felder oder was auch immer updated werden. Was macht man, wenn man in einer neuen Programmversion plötzlich etwas zusätzliches aufrufen will, aber eine public Variable hat? Diese auf @deprecated setzen und dann Getter und Setter implementieren? Macht IMHO keinen Sinn.
Es geht nicht darum alle Getter & Setter durch public Felder zu ersetzen, sondern viele Getter&Setter durch besseres Design ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Meinung zum verwendeten Design Pattern Allgemeine Java-Themen 4
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
S ArrayList Design Allgemeine Java-Themen 4
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
M Diverse Design-Fragen Allgemeine Java-Themen 6
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
T OOP Fehler im Design Allgemeine Java-Themen 9
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
R Parameter Adapter - Design Allgemeine Java-Themen 1
D Bezüglich Design meines Codes Allgemeine Java-Themen 1
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
S Java Design Frage Allgemeine Java-Themen 10
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
M OOP Design Frage Allgemeine Java-Themen 2
J Domain Driven Design - Modellierungsfrage Allgemeine Java-Themen 3
F Welches Design Pattern? Allgemeine Java-Themen 3
H MVC Design Allgemeine Java-Themen 9
J Swing Eigenes Button-design Allgemeine Java-Themen 2
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
A Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten Allgemeine Java-Themen 7
C Gutes Code Design (3 Schichten Modell) Allgemeine Java-Themen 19
D Design Stations-Gitter Allgemeine Java-Themen 4
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
G Design Patterns für Programm Allgemeine Java-Themen 3
I Wie populär ist Design by Contract in Java und was haltet ihr davon? Allgemeine Java-Themen 5
Landei Design-Problem Formel-Parser Allgemeine Java-Themen 10
J Aktionen im State-Design-Modell Allgemeine Java-Themen 3
S Design Oberfläche Allgemeine Java-Themen 2
L Design-Frage: Platzierung der Save-Methode Allgemeine Java-Themen 3
G Domain Driven Design Model Allgemeine Java-Themen 14
G konkretes Domain Driven Design Aggregate Allgemeine Java-Themen 2
ruutaiokwu welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
B Design Problem Allgemeine Java-Themen 8
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
S Frage zum Design der Datenstruktur Allgemeine Java-Themen 10
D design gesucht - Angabe von zu ersetzenden substrings Allgemeine Java-Themen 2
D Design: on-the-fly-Parsing + Datenstrukturen Allgemeine Java-Themen 5
N Welches design pattern? Allgemeine Java-Themen 8
D design client server Allgemeine Java-Themen 10
T Design-Frage Allgemeine Java-Themen 14
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
S JToolBar Design Allgemeine Java-Themen 3
M Bildersyncronisierung - Design Patterns? Allgemeine Java-Themen 2
T Design - Exception in Thread Allgemeine Java-Themen 3
G Composite, Design Pattern, printTree Allgemeine Java-Themen 42
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
M Frage zum Design :: allgemein Allgemeine Java-Themen 6
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
U Frage zu DB Design Allgemeine Java-Themen 3
K Design / Implementierung Allgemeine Java-Themen 5
N Checkstyle - Design for Extension Allgemeine Java-Themen 4
F Design Pattern zur Realisierung von Mehrfachvererbung? Allgemeine Java-Themen 8
E Was ist ein gutes Design fuer meine Programm? Allgemeine Java-Themen 3
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
P Apple Design Allgemeine Java-Themen 5
S design frage Allgemeine Java-Themen 10
T Design-Tipp gesucht Allgemeine Java-Themen 2
M Design von Java Klassen Allgemeine Java-Themen 2
G java design von klassen und projekten Allgemeine Java-Themen 6
K Design: Klassen in Pakete aufteilen - Eure Meinung Allgemeine Java-Themen 8
S Programmierstil / design Allgemeine Java-Themen 9
S Exception design Allgemeine Java-Themen 2
m@nu Exception-Design Allgemeine Java-Themen 4
R Design-Frage Allgemeine Java-Themen 9
N Hilfe beim Design Allgemeine Java-Themen 13
D Design Pattern: Singleton Allgemeine Java-Themen 4
Torres Design-Problem mit Jakarta Struts Allgemeine Java-Themen 2
A Anwendungs-Design (Plugin-Architektur) Allgemeine Java-Themen 4
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
O Maven ein externes jar laden ohne die Applikation neu zu kompilieren Allgemeine Java-Themen 4
Mike80 Processing Programm fiert ohne Arduino ein Allgemeine Java-Themen 2
T Datum OHNE Uhrzeit Zeitzonen-übergreifend Allgemeine Java-Themen 4
N mit sysout, ohne sysout Allgemeine Java-Themen 17
O Programmierprüfung auf moodle ohne Hilfsmittel... Allgemeine Java-Themen 23
Mozart53 JLabel nur meinen Text verschieben ohne Image Allgemeine Java-Themen 3
M Switches ohne String Allgemeine Java-Themen 18
A Java JDK ohne Oracle Konto Allgemeine Java-Themen 5
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
A Java ListNode Element einfügen ohne Bibliothek Allgemeine Java-Themen 6
G Datei aus Ordner wählen, ohne den Dateinamen im Pfad angeben zu müssen Allgemeine Java-Themen 4
Thallius Zeitzone zu einem LocalDate hinzufügen aber ohne es zu ändern... Allgemeine Java-Themen 2
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
X Adjazenzliste ohne ArrayList Allgemeine Java-Themen 6
N Keylistener ohne Dazugehörige Gui Allgemeine Java-Themen 6
P Input/Output entfernte Datei mit Java öffnen ohne Download Allgemeine Java-Themen 5
Kirby.exe Keyboard Input ohne Enter Allgemeine Java-Themen 43
T Abgeleitetes Interface public ohne Schlüsselwort "interface"? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben