Stil ? - ....Nein nicht das Ende des Besens ^^

kaoZ

Top Contributor
Aloha , ich bin in letzer Zeit immer wieder über die tatsache gestolpert das in der Standard API immer folgende Konstrukte notwendig sind um z.B bei einem JDialog Komponenten einen Rahmen zu setzen

Java:
dialog.getContentPane().setBorder(xxx);

hier wird erst über einen getter das Root-Element geholt und dann (indirekt) darüber auf dessen Setter zugegriffen .

Ich meine Irgendwo mal gelesen zu haben das dies aber schlechter Stil ist, und man das ganze lieber über delegation lösen sollte, sprich in der Komponenten oder dem Root Element die Methode so überschreiben / und oder anbieten, das diese dann an die gewünschte Komponenten Delegiert ?

Ich habe es bislang immer so realisiert das ich genau dies umgesetzt habe, sprich wenn ich eine eigene Klasse hatte z.B (eine die ein UI darstellt) habe ich dort direkt Methoden angeboten die an die jeweilige Componente Delegieren, ( dies steigert natürlich die Anzahl an Methoden, führt allerdings zu kürzeren Aufrufhierarchien und vermeidet Verkettung von Punkt-Operatoren)

hier ist z.B contentPane ein JPanel und die Gui hält (als Root-Element) eine Referenz auf ihr Child
Java:
public void addContent(JComponent comp){
  contentPane.add(comp);
}

Was oder wie ist es denn nun am Sinnvollsten ? Stilistisch am schönsten ?
Was ist Konzeptionell richtig ?

Mit erstere, Lösungsansatz spart man sich natürlich die Methoden in den Superklassen / und oder RootElementen.


Haut mal raus was ihr davon haltet ;)
 
Zuletzt bearbeitet:

Joose

Top Contributor
Ich meine Irgendwo mal gelesen zu haben das dies aber schlechter Stil ist, und man das ganze lieber über delegation lösen sollte, sprich in der Komponenten oder dem Root Element die Methode so überschreiben / und oder anbieten, das diese dann an die gewünschte Komponenten Delegiert ?

Fehlersuche:

Der Nachteil bei solchen Anweisungsverkettungen ist die Fehlersuche.
Bei kurzen ist es nicht so gravierend, aber viele lassen sich dazu hinreißen dort viele Methoden aufzurufen und haben plötzlich 5 oder mehr getter hintereinander stehen. Wenn nun in dieser Zeile zum Beispiel eine NullpointerException fliegt, woher weißt du nun wo der Fehler liegt? Beim 1.Getter, beim 2.? Man muss die Zeile wieder aufsplitten bzw. per Debugger kontrollieren.

Beim Weiterdelegieren kann man ohne Probleme im StackTrace sehen wo der Fehler liegt und den Aufrufer interessiert es nicht was man selber macht bzw. weiteraufruft.

Referenzen:

Desweiteren kann es sein das viele Abhängigkeiten nur wegen solchen Verkettungen entstehen. Weil du weißt nur welche Methoden man weiterverwenden kann wenn die entsprechende JAR referenziert wird.

Verkettung
A referenziert B
A referenziert C
B referenziert C

Delegierung
A referenziert B
B referenziert C

Ändert man C kann es sein das man A und B ändern muss, anders nur B.

Du kannst auch eine Parallel zu unserer Arbeitswelt ziehen: Ein Chef wird nicht den untersten Arbeiter direkt eine Aufgabe zuteilen (Ausnahmen gibts wahrscheinlich, aber eben Ausnahmen). Es wird auch die Hierarchie eingehalten: Chef->Abteilungsleiter->Arbeiter
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Also ist doch der Weg den ich bisher gewählt habe besser ?

Ich bin eigentlich ein Freund davon dinge möglichst Atomar zu gestalten.

(auch wenn dies Bedeutet das meistens die Anzahl der Klassen und oder Methoden auch in dieser Relation wachsen)

Ich kann so wie ich es bisher immer gehalten hab zumindest eben genau das nachvollziehen , wenn ich einen Fehler suche laufe ich einfach die Aufrufhierarchie ab und sehe dann genau wo an welcher stelle der Fehler auftritt.

Beim Weiterdelegieren kann man ohne Probleme im StackTrace sehen wo der Fehler liegt und den Aufrufer interessiert es nicht was man selber macht bzw. weiteraufruft.

Aber warum isses dann in der API so das es eben nicht eingehalten wird :) ?
 
Zuletzt bearbeitet:

ssoul26

Bekanntes Mitglied
Sei doch froh, dass die API dir alle Freiheiten gibt. Willst du delegieren, so tue es, es bleibt dir überlassen. Die einen wollen es so, die anderen wiederum nicht. Das ist der Sinn der freien API.
 

kaoZ

Top Contributor
Sei doch froh, dass die API dir alle Freiheiten gibt. Willst du delegieren, so tue es, es bleibt dir überlassen. Die einen wollen es so, die anderen wiederum nicht. Das ist der Sinn der freien API.

Eben genau diese Möglichkeit habe ich aber in besagtem Fall nicht (ausser ich erstelle eine Subklasse), ich bin dazu 'gezwungen' eben indirekt attribute über verkettung von Gettern und Settern zu ändern, da eben eine Methode welche einfach an das Rootpane delegiert hier fehlt ;)

sprich es gibt z.B im JDialog keine Methode setBorder(Border b);
sonder du MUSST du eben den besagten weg über den getter nehmen
Java:
getContentPane().setBorder(xxx);

gut das ist nun nicht gravierend da die Aufrufhierarchie gering ist, aber es geht ja auch um das Prinzip,
und darum das ich eben mal gelesen habe das eben genau das schlechter Stil ist.

ich müsste hier eine Klasse ableiten um eben gewünschte Funktionalität hinzuzufügen.
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Mal das Prinzip außen vor gelassen; Ich verstehe dein Beispiel nicht. JDialog hat nichts mit Bordern am Hut. Border tauchen in der Klasse JComponent auf. Zu setzen per public Methode. Also kann man bei jeder davon ableitenden Klasse eben diese Methode zum setzen eines Borders nutzen.
 

kaoZ

Top Contributor
JDialog hat nichts mit Bordern am Hut.

das ist natürlich korrekt, und dem will ich auch nicht wiedersprechen, dennoch ist ein JDialog ja bereits von einem Top level container umgeben, welcher eben diese Funktionalität bietet, warum bietet man dann im JDialog dann nicht eben eine Methode an welche eben diese Funktion direkt bereitstellt ?

Und du hast natürlich recht, in der Klasse Component / Container welche eine Superklasse von JComponent ist steht die Funktionalität nicht zur verfügung,
erst mit JComponent gibt es die möglichkeit der Komponente einen Border zusetzen.

JDialog erbt aber in seiner Hierarchie von Dialog und somit Generalisiert von Component und nicht von JComponent, das habe ich übersehen.

Dennoch wäre ist nun doch rein vom Faktor des logischen standpunktes aus nicht sinnvoll einen JDialog welcher ja eine Referenz auf den ihn umgebenen Top - Level Container halten muss ( also diesen als sein Attribut verwaltet hier ein JRootPane), auch eine Methode zu verpassen welche es ermöglicht direkt dessen attribute über Delegation zu beeinflussen ?
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Ok, Ich verstehe. Aber um JDialog mit einer setBorder Methode auszustatten müsste sichergestellt sein, dass der Container (ContentPane) immer eine Spezialisierung von JComponent ist. Hier hat man sich aber auf Container als Klasse geeinigt. Warum weiß ich nicht, wird wohl aber auch seinen Grund gehabt haben.

Ansonsten verstehe ich von solcher Architektur nicht genug, um jetzt zu sagen wo die Vorteile/Nachteile von solchen Delegates liegen.
 

dzim

Top Contributor
Ich glaub, das "Problem" ist einfach, dass Swing eine Lightweight-UI ist und vom Host-System eigentlich nur das leere Fenster zu verfügung gestellt bekommt. Der Rest wird dann quasi live auf dem Canvas, oder was dahinter steht, gezeichnet.
Also ja: Das ist die vielgelobte Freiheit, die man da hat.

Da ich mit Swing nichts am Hut hab, möchte ich nur eine Frage stellen: Heisst dass, es gibt keine Systemumrandung? Keine Fensterbuttons etc.? Oder gibt es die doch, aber du hast dich nur gerade entschieden, ein undekoriertes Fenster zu nehmen? Nur so aus reiner Neugierde...
 

kaoZ

Top Contributor
Da ich mit Swing nichts am Hut hab, möchte ich nur eine Frage stellen: Heisst dass, es gibt keine Systemumrandung? Keine Fensterbuttons etc.? Oder gibt es die doch, aber du hast dich nur gerade entschieden, ein undekoriertes Fenster zu nehmen? Nur so aus reiner Neugierde...

Nene, da gibt es Standardmäßig Rahmen, in diesem Speziellen Fall ging es darum den Rahmen des Dialoges anzupassen, in diesem Fall den der JRootPane welche als contentPane ( Top-Level-Container ) für den JDialog verwendet wird , in meinem Fall wollte ich einen EmptyBorder setzen, dies ging eben nur diese Aufrufhierarchie, da JDialog keine methode anbietet die an die RootPane delegiert, was mich eben wunderte da ich wie gesagt schonmal gelesen hatte das eben genau das verwenden dieser Art aufrufhierarchie vermieden werden sollte, und man lieber mit delegate arbeiten sollte ( so wie ich es im normalfall eigentlich auch immer mache ).

Ok, Ich verstehe. Aber um JDialog mit einer setBorder Methode auszustatten müsste sichergestellt sein, dass der Container (ContentPane) immer eine Spezialisierung von JComponent ist. Hier hat man sich aber auf Container als Klasse geeinigt. Warum weiß ich nicht, wird wohl aber auch seinen Grund gehabt haben.

Das kann natürlich sein das es in diesem Fall absichtlich so gemacht worden ist um hier die 'freiheit' zu lassen und sich deshalb darauf geeinigt hat Container als Grundlage zu verwenden .
 

Harry Kane

Top Contributor
Ich würde solche Delegates nur verwenden, wenn mich der alternative Weg mit den verketten Calls zwingen würde, einen Teil der API offenzulegen, den ich lieber verstecken würde. Aber wenn es darum geht, eine sowieso öffentlich zugängliche Eigenschaft eines sowieso öffentlich zugänglichen member zu verändern, sehe ich keinen Grund für ein delegate. Bei verketteten Aufrufen, die immer wieder zu Problemen führen, die aber auch nicht in ihre Einzelteile zerlegen möchte, weil sie so komplex sind, und die man gleichzeitig häufig braucht, würde ich mir in einer Utility Klasse eine statische Hilfsmethode anlegen.
Die delegates können nämlich eine API massiv aufblähen. Was ist, wenn du nicht die Border der content pane sondern deren Layout setzen möchtest? Oder den foreground der glass pane? Für welche Eigenschaft von welchem member soll man delegates anbieten, für welche nicht?
 

kaoZ

Top Contributor
Die delegates können nämlich eine API massiv aufblähen. Was ist, wenn du nicht die Border der content pane sondern deren Layout setzen möchtest? Oder den foreground der glass pane? Für welche Eigenschaft von welchem member soll man delegates anbieten, für welche nicht?

Das ist denke ich der Hauptgrund dafür das man sich nicht für Delegates sonder für die Verkettung entschieden hat, ist ja auch logisch , in gewisser hinsicht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Methoden Code Quality und Stil Java Basics - Anfänger-Themen 5
M Vererbung Schlechter Stil? Java Basics - Anfänger-Themen 10
B Grundsätzliche Klassen-Struktur/Stil Java Basics - Anfänger-Themen 12
S Mein Code is unübersichtlich - besseren Stil Java Basics - Anfänger-Themen 6
S Unbeschaeftigten Thread in einer Schleife schlafen legen? Schlechter Stil? Java Basics - Anfänger-Themen 7
S Schlechter Stil beim Exception Handling Java Basics - Anfänger-Themen 6
J Getter und Setter auch intern benutzen - guter Stil? Java Basics - Anfänger-Themen 31
nabla Code Stil -- Eclipse Warnings Java Basics - Anfänger-Themen 9
H [Stil] Exceptions in der Klasse behandeln oder throwen? Java Basics - Anfänger-Themen 62
P DotComVersenken -Spiel im Schiffeversenken-Stil - erstellen- Komm jetzt nicht weiter. Java Basics - Anfänger-Themen 11
P Spiel im Schiffe-Versenken Stil, Problem mit Erstellung des zweidimensionalen ARRAYs Java Basics - Anfänger-Themen 7
S sauberer Stil von return Wert (try, catch, finally) Java Basics - Anfänger-Themen 9
hdi Programmier-Stil : Speicher vs. Quellcode Java Basics - Anfänger-Themen 67
U Vernünftige Strukturierung, Guter Stil,. Java Basics - Anfänger-Themen 12
K BufferedReader im Konstruktor // guter Stil ? Java Basics - Anfänger-Themen 2
F Zugriff auf Instanzvariablen, Frage zum guten Stil Java Basics - Anfänger-Themen 2
J Guter Stil der Java-Programmierung Java Basics - Anfänger-Themen 5
G Array mit Schleife durchlaufen - guter Stil? Java Basics - Anfänger-Themen 20
frau-u guter Stil - wie macht mans am Besten? Java Basics - Anfänger-Themen 8
H schlechter objektorientierter stil Java Basics - Anfänger-Themen 6
sserio Endlosschleife ja nein? Java Basics - Anfänger-Themen 13
T jOptionPane zum schließen von Fenster, wie "Ja" und "Nein" anstatt Yes und No Java Basics - Anfänger-Themen 2
K FYI: Reguläre Ausdrücke nutzen ja/nein Java Basics - Anfänger-Themen 2
C Brauche dringend Hilfe. Umfrage mit ja und nein in Java erstellen? Java Basics - Anfänger-Themen 12
R Primzahl ja/nein - besserer Code möglich? Java Basics - Anfänger-Themen 2
F Ja Nein Abfrage und andere Probleme Java Basics - Anfänger-Themen 5
X Ja nein abfrage? Java Basics - Anfänger-Themen 9
D Button´s Visible via Ja/Nein eingabe Java Basics - Anfänger-Themen 13
Ksanatos Ja nein verzweigung. Java Basics - Anfänger-Themen 22
N Anfrage- wiederholen Ja oder Nein Java Basics - Anfänger-Themen 12
I wie definiere ich ja oder nein für true or false Java Basics - Anfänger-Themen 7
M Kompilieren - Eclipse ja, Konsole nein Java Basics - Anfänger-Themen 15
A Englisch ja oder nein Java Basics - Anfänger-Themen 19
multiholle OOP MVC -> Ja/Nein? Java Basics - Anfänger-Themen 7
O import ja....extends nein Java Basics - Anfänger-Themen 5
Kasoki Compilen von Java Scripts (Nein kein JavaScript xD) Java Basics - Anfänger-Themen 13
V Return - JA/NEIN - Parameterübergabe Array (Referenz) Java Basics - Anfänger-Themen 7
G ZUfällig "ja" "nein" oder "vielleic Java Basics - Anfänger-Themen 7
I Dialog - "Ja" / "Nein" abfangen Java Basics - Anfänger-Themen 3
M JSP: Problem bei Link ja oder nein? Java Basics - Anfänger-Themen 2
D Komponente setvisible ja-nein Java Basics - Anfänger-Themen 4
M Datei vorhanden ja/nein? Java Basics - Anfänger-Themen 9
M Parameter existiert ja/nein - prüfen? Java Basics - Anfänger-Themen 12
I Webservice funktioniert nicht Java Basics - Anfänger-Themen 5
C Abbruch einer Schleife mit break, meine Übung funktioniert nicht richtig Java Basics - Anfänger-Themen 4
SarahXyy Ergebnisse stimmen nicht überein? Java Basics - Anfänger-Themen 11
thomas55 Erste Schritte Modul läuft in IntelliJ, nicht in NetBeans Java Basics - Anfänger-Themen 11
richis-fragen Nicht ausführbares JAR, externe jars mit einbinden Java Basics - Anfänger-Themen 7
S Erstes Programm: Hallo Welt funktioniert nicht. Java Basics - Anfänger-Themen 3
O Obfuscateter Code lässt sich nicht ausführen? Java Basics - Anfänger-Themen 7
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
D Regex greift nicht richtig Java Basics - Anfänger-Themen 4
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
richis-fragen JTable Header ausgeblendete (width = 0) nicht per mouseDragged aufziehen. Java Basics - Anfänger-Themen 9
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
J Datenüberwachung funktioniert nicht Java Basics - Anfänger-Themen 9
S Wie debugge ich dies am besten: SingleThreadExecutor führt Task nicht aus..? Java Basics - Anfänger-Themen 29
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
N Klassen Hintergrundfarbe in JPanel ändert sich nicht Java Basics - Anfänger-Themen 3
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
J .jar datei öffnen funktioniert nicht Java Basics - Anfänger-Themen 17
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
M OOP Brüche nicht richtig berechnen Java Basics - Anfänger-Themen 3
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
G Mit jPackage erstellte EXE funktioniert nicht Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
G Robot funktioniert nicht bei SelectionListener Java Basics - Anfänger-Themen 6
D MacOS: PDF erstellen geht nicht Java Basics - Anfänger-Themen 1
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
missy72 Erste Schritte (nicht) Deterministischer endlicher Automat Java Basics - Anfänger-Themen 9
T Getter/Setter - wie sieht ein Setter aus? Und wie nicht? Java Basics - Anfänger-Themen 34
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
P Netbeans installation geht nicht Java Basics - Anfänger-Themen 26
R RegEx funktioniert nicht Java Basics - Anfänger-Themen 14
T HashMap Lsite gibt die sachen nicht aus wie gewollt. Java Basics - Anfänger-Themen 3
H Counter durch gepresste Taste nur auf 1 erhöhen und nicht durchzählen lassen Java Basics - Anfänger-Themen 7
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
T scanner nicht erkannt Java Basics - Anfänger-Themen 3
monsterherz Punkt Notation funktioniert nicht Java Basics - Anfänger-Themen 4
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
monsterherz if / else if mit Fehler den ich leider nicht finde Java Basics - Anfänger-Themen 11
D Jar Datei startet unter Linux nicht Java Basics - Anfänger-Themen 3
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben