Hi zusammen,
ich habe mal eine Frage zur Architektur eines Programms:
Angenommen ich habe ein Programm, bestehend aus verschiedenen Komponenten für verschiedene Aufgabe. D.h. ich habe einen modularen Aufbau. Es gibt eine zentrale Komponente für die Verwaltung des ganzen Systems, der sogenannte Controller, der auch die einzelnen Komponenten instanziiert und verwaltet.
Die Idee dahinter ist, dass nun alle Komponenten immer über den Controller auf Funktionalität des Programms zugreifen können.
Ein einfaches Beispiel: Ein MP3Player bestehend aus verschiedenen Komponenten. Einer Play-Komponente, einer Komponente, die Cover runterläd usw.
Wenn nun einzelne Komponenten auf Funktionalität des Player zugreifen wollen tun sie das über den Controller.
Das Problem ist nun: Die einzelnen Komponenten kennen ja nur den Controller, zumindest war so das Konzept. D.h. wenn man die Funktionalität irgendeiner Komponente aufrufen möchte, muss man dies immer über den Controller machen. Das Ergebnis ist nun, dass der Controller viele Wrapper-Methoden hat:
Und so muss ich das theoretisch für jede Methode jeder Komponente machen, damit die Komponenten alle Funktionalität zur Verfügung haben.
Eine andere Idee wäre, dass man die Komponenten über getter-Methoden vom Controller abfragen kann. Dann kann jede Komponente einen Aufruf folgendermaßen ausführen:
Damit spare ich mir nun die ganzen Wrapper-Methoden im Controller. Aber dann muss jede Komponente ja die anderen Komponenten kennen, was vielleicht nicht unbedingt schön ist.
Natürlich ginge auch sowas in der Art:
Aber so wirklich schön ist das ja auch nicht. Im Grunde ist mein Controller doch hier eine Fassade oder?
Gibt es hier irgendwelche Best Practices, wie man genau solche Architekturen am besten umsetzt?
Ein anderes Beispiel hierzu wäre ein Mikrokernel (Mach, Hurd usw.):
Ich habe einen Mikrokernel, der zentral die einzelnen Komponenten läd, wie z.B. Dateisystem usw. Wie sprechen nun die Komponenten miteinander? Oder können die das gar nicht? Muss alles über den Controller / Mikrokernel gehen? Hat der dann auch ewig viele Wrapper-Methoden?
Ich hoffe, es wird klar, wo das Problem liegt. Würde mich über ein paar Anregungen freuen.
Gruß
Mike
ich habe mal eine Frage zur Architektur eines Programms:
Angenommen ich habe ein Programm, bestehend aus verschiedenen Komponenten für verschiedene Aufgabe. D.h. ich habe einen modularen Aufbau. Es gibt eine zentrale Komponente für die Verwaltung des ganzen Systems, der sogenannte Controller, der auch die einzelnen Komponenten instanziiert und verwaltet.
Die Idee dahinter ist, dass nun alle Komponenten immer über den Controller auf Funktionalität des Programms zugreifen können.
Ein einfaches Beispiel: Ein MP3Player bestehend aus verschiedenen Komponenten. Einer Play-Komponente, einer Komponente, die Cover runterläd usw.
Wenn nun einzelne Komponenten auf Funktionalität des Player zugreifen wollen tun sie das über den Controller.
Das Problem ist nun: Die einzelnen Komponenten kennen ja nur den Controller, zumindest war so das Konzept. D.h. wenn man die Funktionalität irgendeiner Komponente aufrufen möchte, muss man dies immer über den Controller machen. Das Ergebnis ist nun, dass der Controller viele Wrapper-Methoden hat:
Code:
public void Controller {
public void doXY() {
KomponenteA.doXY();
}
public void doYZ() {
KomponenteB.doYZ();
}
}
Und so muss ich das theoretisch für jede Methode jeder Komponente machen, damit die Komponenten alle Funktionalität zur Verfügung haben.
Eine andere Idee wäre, dass man die Komponenten über getter-Methoden vom Controller abfragen kann. Dann kann jede Komponente einen Aufruf folgendermaßen ausführen:
Code:
controller.getKomponenteA().doXY();
Damit spare ich mir nun die ganzen Wrapper-Methoden im Controller. Aber dann muss jede Komponente ja die anderen Komponenten kennen, was vielleicht nicht unbedingt schön ist.
Natürlich ginge auch sowas in der Art:
Code:
controller.doAction("KomponentenName", "Methodenname", Parameterliste);
....
public Controller {
...
public void doAction(String componentName, String methodName, ArrayList<String>Parameter) {
// Irgendwie mit Reflection oder sonst was die Methode aufrufen
}
...
}
Aber so wirklich schön ist das ja auch nicht. Im Grunde ist mein Controller doch hier eine Fassade oder?
Gibt es hier irgendwelche Best Practices, wie man genau solche Architekturen am besten umsetzt?
Ein anderes Beispiel hierzu wäre ein Mikrokernel (Mach, Hurd usw.):
Ich habe einen Mikrokernel, der zentral die einzelnen Komponenten läd, wie z.B. Dateisystem usw. Wie sprechen nun die Komponenten miteinander? Oder können die das gar nicht? Muss alles über den Controller / Mikrokernel gehen? Hat der dann auch ewig viele Wrapper-Methoden?
Ich hoffe, es wird klar, wo das Problem liegt. Würde mich über ein paar Anregungen freuen.
Gruß
Mike