Designfrage - Strategiemuster.

Status
Nicht offen für weitere Antworten.

haemi

Mitglied
Hallo zusammen,

eine schwierig zu stellende Frage, hoffentlich bekomm ich es trotzdem verständlich hin:

Ich habe eine Superklasse "Tabelle", die dafür zuständig ist, eine Tabelle zu zeichnen, die einige Stückchen spielen kann (Auf- und Zuklappen von Teilen, dann Aufsummieren von Daten in den zugeklappten Reihen, blablabla.

Ich habe es beim ersten Mal so gelöst, dass die Superklasse eigentlich so ziemlich alles kann, also alle Methoden enthält und die Unterklassen sehr, sehr schlank sind. Dadurch hat sich langsam ergeben, dass die Methoden unendlich lange sind und viele if()-Abfragen beinhalten (WENN du eine XY-Tabelle bist, dann mach das, ansonsten das andere). Dadurch wird alles ziemlich unübersichtlich, das Erweitern und Hinzufügen von Funktionalität ist relativ schwierig.

Dann wollte ich die Methoden in die jeweiligen Unterklassen auslagern, also jeweils das, was für die speziellen Tabellen notwendig ist. Das ergibt aber viel doppeltes, da Methoden zum Beispiel folgendermaßen aussehen:

methode xy() {
// zeugs für alle tabellen
// zeugs für alle tabellen
// zeug nur für tabelle a
// zeug für alle tabellen
// zeug nur für tabellen b + c
// zeug für alle tabellen
// zeug nur für tabelle b
...
}

Gibt es da ein Pattern? Mir fällt immer das Strategie-Muster ein, aber das will irgendwie nicht so recht hinhauen... Andere Einfälle? Ich wär wirklich froh um ein paar Denkansätze, da ich mir langsam echt schwer tu...

Danke und schöne Grüße!
 

EOB

Top Contributor
hm, probiers doch mal mit dem strategy pattern. also oben ein interface tabelle und eine methode xy, welche dann von der jeweils implementierenden klasse implementiert wird. dann hast du eine tabelle für sache x und eine tabelle für sache y und so weiter. bedeutet, du hast das jeweilige verhalten in ner klasse gekapselt und kannst es zb wieder an anderer stelle verwenden. wann unterscheidest du denn...kannst du "instance of" nehmen?

grüße
eob

edit: oder du nimmst ne abstakte klasse, die dann die zu implementierende methode als abstrakt definiert hat und was du immer verwenden willst, vererbst du an die erbende klasse, indem dus eben in der abstrakten klasse implementierst ...
 

haemi

Mitglied
Guten Morgen EOB,

vielen Dank schon mal für deine Antwort!

Meine Überlegungen gingen eh schon in die Richtung, was mich allerdings noch (sehr) stutzig macht: In den jeweiligen Implementierungen sind Teile exakt die gleichen, wiederholen sich also in den einzelnen (Unter)Tabellen. Ist das ein Zeichen für schlechtes Design oder ist das 'normal' und 'okay'?

Also zum Beispiel:

In Untertabelle A:
Code:
public void function_a() {
        // zeugs wird gemacht
        // spezielles A-Zeug wird gemacht
        // zeugs wird gemacht
        // spezielles A-Zeug wird gemacht
}

In Untertabelle B:
Code:
public void function_a() {
        // zeugs wird gemacht (das gleiche wie oben)
        // spezielles B-Zeug wird gemacht
        // wieder das gleiche zeug wie oben
        // jetzt wird allerdings nichts mehr gemacht
}

Teile sind gleich, andere unterscheiden sich allerdings... Und genau die Teile, die eben gleich sind bzw. sich wiederholen, machen mich stutzig...

Vielen Dank schon jetzt,

Haemi
 

lhein

Top Contributor
Füg halt noch eine abstrakte Superklasse Tabelle hinzu, die das Interface implementiert. Schreibe dort die Methode function_a() so in der Richtung:

Code:
public void function_a() {
        // zeugs wird gemacht
        doSpecial_1();
        // zeugs wird gemacht
        doSpecial_2();
}

protected abstract void doSpecial_1();

protected abstract void doSpecial_2();

Dann leite für deine Tabellen jeweils von der Klasse ab und implementiere dort die beiden Methoden doSpecial_x().
Das ganze nennt man Method-Hooks.

gruß
lr

PS: Und vergib ordentliche Methodennamen...nicht doSpecial ;)
 

EOB

Top Contributor
genau, alles was mehrfach vorkommt kannst und solltest du vererben, ähnlich wie ich es schrieb und auch LR :). doppelter code ist so gut wie immer schlechter programmierstil, da du ja bei einer änderung an mehr als einer stelle ändern musst und das birgt natürlich fehler in sich (man vergisst eine stelle, ändert den code unterschiedlich .... usw).

grüße
eob
 

EOB

Top Contributor
man sollte kein pattern fever haben, aber die template method könnte man hier auch einbringen :) ... je nach implementierungsaufwand.

@LR: ist das was du mit method hooks meinst?

grüße
eob
 

lhein

Top Contributor
Das Pattern heißt Template Pattern. Das ist korrekt.
Die Methoden doSpecial_x sind im Prinzip nichts weiter als Hooks. Man müßte sie nichtmal abstract machen sondern könnte sie einfach nichts tun lassen.
Das ist es was ich mit Method Hook eigentlich sagen wollte.

lr
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben