Lange Methodenaufrufe == suboptimales Klassendesign?

Maik.Neumann

Aktives Mitglied
Hallo !

Ich habe mal eine Frage an euch. Manchmal passiert es mir, dass ich in meinem Sourcecode Methodenaufrufe, wie den folgenden implementieren muss:

Java:
public void getAnzahlPersonen(final FormModel formModel){

    return formModel.getService().getPersonenDao().getAnzahlPersonenProQuartal();

}

Das ist jetzt natürlich ein sehr abstraktes Beispiel (teilweise auch von mir stark vereinfacht und deutlich modifiziert). Was ich hier verdeutlichen will, sind die vielen mit dem . gtrennten Methodenaufrufe.

Ich finde diese generell merkwürdig (häufig aber unvermeidbar), teilweise auch schlecht lesbar und frage mich deshalb, ob sie schon eine Art Bad Smell darstellen könnten?

Wie seht ihr das? Deuten solche Aufrufe schon ein ein fehlgeschlagenes Klassendesign und falsche-, oder gar keine Trennung von Zuständigkeiten innerhalb der Klassen hin? Weiß eine Klasse evtl. zuviel und die andere zu wenig?

Gibt es für solche Art von Methodenaufrufen eigentlich auch eine offiziell anerkannte Bezeichnung?

Danke und Gruß
 

djafix

Mitglied
also ich würde vorschlagen getAnzahlPersonenProQuartal() schon in der klasse von formModel zu implementieren. also einfach die methoden dort durchgeben, dass du dir schon von der obersten klasse in der hierarchie den wert geben lassen kannst.
aber ob das nun guter oder schlechter stil ist, muss glaub ich jeder für sich selbst wissen. einfacher wäre es in jedem falle so zu machen wie oben beschrieben
 

Joose

Top Contributor
Ja solche Verkettungen von Methodenaufrufen sind schlecht!
Unter anderem hast du den Nachteil, eine dieser Methoden "null" zurückliefert und dabei dann eine Exception geworfen wird. Sprich dir fehlt eine Prüfung ob du überhaupt einen entsprechenden Service oder DAO zur Verfügung hast.
Außerdem ist so keine Trennung deiner Schichten möglich (bzw. schwerer) weil formModel deine Services kennen muss, deine Daos usw..

Also wie djafix schon sagt ... die einzelnen Aufrufe einfach in den enstprechenden Klassen kapseln! So kannst du eine entsprechende Fehlerbehandlung implementieren und auch dein Programm schön trennen (GUI <-> Logik <-> Daten)
 

Maik.Neumann

Aktives Mitglied
Hallo !

Also wie djafix schon sagt ... die einzelnen Aufrufe einfach in den enstprechenden Klassen kapseln!

Ich verstehe nicht ganz, wie das konkret aussehen soll, dass einzelne Aufrufe in entsprechenden Klassen gekapselt werden sollen. Führt das letztenendes nicht wieder darauf zurück, dass mein FormMOdel alles kennen muss? Irgendwie habe ich da ein Verständnisproblem
 

djafix

Mitglied
du kannst einfach eine methode in der klasse FormModel namens getAnzahlPersonenProQuartal() definieren in der einfach formModel.getService().getPersonenDao().getAnzahlPersonenProQuartal() zurückgegeben wird.

besser wäre aber, wie joose beschrieben hat, das über jede klasse zu machen:

1. in PersonenDao eine methode namens getAnzahlPersonenProQuartal()
2. in Service eine Methode getAnzahlPersonenProQuartal() welche methiode unter 1. aufruft
3. Methode in FormModel namens getAnzahlPersonenProQuartal(), welche methode unter 2. aufruft

damit ist aufjedenfall das problem mit dem langen namen gelöst. und wenn deine klassen es halt nicht anders zulassen, dann muss das formModel nunmal alle seine klassen kennen
 

Natac

Bekanntes Mitglied
Zu einem gewissen Grad gebe ich meinen Vorpostern Recht.

Ich halte es bei mir so, dass ich bspw. in der Gui ein zentrales Objekt (Nennen wir es "Logic") habe, über die für die jeweilgen Daten Operationen aufrufbar sind. Wenn ich jetzt aus einem Dialog allerdings prüfen will, ob der Namen eines Nutzers existiert kann es schonmal eine Aufrufkette geben, in der ich mich erst zum zentralen Objekt hin-"hangele" und dann die Abfrage mache:

Java:
public UserDialog extends JDialog{

private boolean userExists(String name){ // von irgendwo im Dialog aufgerufen
 return getMainFrame().getLogic().getUserManager().existsByName(name);
}
}

Hierbei kann ich aber sicherstellen, dass keine Aufruf null zurückliefert. Sicherlich könnte man darüber streiten, ob der UserDialog nicht eine Methode getUserManager haben sollte, die man aufruft und dann einfach den ersten Teil kapselt. Ich für meinen Teil spare mir diese privaten Methoden aber lieber und schreibe obige Ketten, da ich die Zusatzmethoden (zumal die dann evtl. nur einmal genutzt werden) den Code unleserlicher machen als die obige Kette.

Prinzipiell solltest du dich fragen, ob du mit so einer Kette deinen Scope verlässt (bspw. direkte Navigation von der Gui in die Persistenzschicht), oder eben nicht. In ersterem Fall würde ich von der Aufrufkette auch eher abraten, da du damit die Kapselung verwischt. Im zweiten Fall finde ich das eher weniger problematisch.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
berserkerdq2 Lange Variablennamen schlechter Programmierstyle? Java Basics - Anfänger-Themen 4
Devin Wie lange braucht man um Java zu beherrschen und wie kann man es am schnellsten erlernen? Java Basics - Anfänger-Themen 7
CptK Methoden While-Schleife so lange ausführen, wie Methode etwas zurückgibt Java Basics - Anfänger-Themen 2
T Anzeige, wie lange es noch dauert bis ein File gesendet ist. Java Basics - Anfänger-Themen 2
K Wie lange kann / soll das dauern? Java Basics - Anfänger-Themen 6
I HTML Tabelle nur so lange erzeugen bis Höhe erreicht Java Basics - Anfänger-Themen 9
B sehr lange Srings in File schreiben Java Basics - Anfänger-Themen 4
O Löschen lange pfade...Fehler? Java Basics - Anfänger-Themen 1
T Android App: Laden dauert lange Java Basics - Anfänger-Themen 1
A scan.nextLine() - Wenn man zu lange nichts macht, soll etwas passieren Java Basics - Anfänger-Themen 3
C Wie lange dauert ein Projekt in Java? Java Basics - Anfänger-Themen 10
R Zeit kommt mir zu lange vor... Java Basics - Anfänger-Themen 7
G Socket erstellen dauert sehr lange. Java Basics - Anfänger-Themen 4
hedges Prog braucht lange, schlecht programmiert? Java Basics - Anfänger-Themen 3
H Eingabe so lange wiederholen bis gültiger Wert eingegeben. Java Basics - Anfänger-Themen 7
F Lange Rechenzeit. Java Basics - Anfänger-Themen 10
G Wie lange dauert bei euch das Dateilesen? Java Basics - Anfänger-Themen 18
G Seeehr lange Variablen? Java Basics - Anfänger-Themen 5
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
S Java Methodenaufrufe zählen Java Basics - Anfänger-Themen 4
M Methodenaufrufe im Konstruktoren Java Basics - Anfänger-Themen 31
D Wie baue ich sinnvoll eine Klasse, genauer die Methodenaufrufe auf? Java Basics - Anfänger-Themen 4
E Methoden Methodenaufrufe zählen Java Basics - Anfänger-Themen 11
D Interfaces und allgemeingültige Methodenaufrufe Java Basics - Anfänger-Themen 6
A Methodenaufrufe von Anonymen Klassen Java Basics - Anfänger-Themen 6
Kenan89 Methodenaufrufe verketten Java Basics - Anfänger-Themen 16
H Methodenaufrufe protokollieren Java Basics - Anfänger-Themen 7
T Methodenaufrufe zählen Java Basics - Anfänger-Themen 24
R Methodenaufrufe Java Basics - Anfänger-Themen 15
L Methodenaufrufe Protokollieren Java Basics - Anfänger-Themen 5
G Methodenaufrufe funktionieren nicht Java Basics - Anfänger-Themen 2
L Reihenfolge der Methodenaufrufe Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben