F
Firephoenix
Gast
Folgendes Problem (eher Designdiskussion als Problem):
Ich habe eine Persistenzschicht die aktuell für 3 Typen X Y und Z verwendet wird.
Alle Typen in einer Klasse zu verwalten bietet sich an, da meine basisschicht nicht typsicher ist - ich kann also intern alle Klassen über einen Kamm scheren und spare gleichzeitig doppelten code.
Das Designproblem entsteht bei dem Interface der Persistenzeinheit, aktuell sieht es von den Schnittstellen etwa so aus:
-save(X);
-save(Y);
-save(Z);
-update(X);
-...
-remove(X);
weiterhin können observer hinzugefügt werden die über die Operationen der Typen informiert werden (z.B. kann ObserverX informiert werden wenn ein Objekt X gespeichert oder entfernt wird, gleiches für ObserverY und Observer Z).
In meiner Clientschicht macht sich das ganze sehr schön, eine View für X Y und Z implementiert einfach ObserverX, ObserverY und ObserverZ (die objekte gehören semantisch zusammen und müssen gemeinsam dargestellt werden) und registriert sich selbst für alle 3 Observertypen bei der Persistenzeinheit.
Dafür bekomme ich in der Persistenzeinheit logischerweise pro Entity redundanten Code.
Für den Architekturentwurf würde ich selber auf Generics zurückgreifen, mit einer generische Persistenzschicht die die Methoden
-save(T)
-update(T)
-remove(T)
-registerObserver(Observer<T>)
anbietet.
Dann muss allerdings meine tatsächliche Persistenzeinheit 3 fast identische adapterklassen beeinhalten, da ich nicht Persistence<X> Persistence<Y> und Persistence<Z> gleichzeitig implementieren kann.
Weiterhin kann mein view auch nicht Observer<X>, Observer<Y> und Observer<Z> implementieren.
Ich würde also auch hier jeweils einen Adapter benötigen.
Alternativ könnte ich meine typsicherheit über Bord werfen und einfach bei allen Client-Anwendungen casten was definitiv kein schöner Stil ist.
Was wäre eure bevorzugte Lösung?
1. Ein Observer und 3 fast identische Methoden pro Entity-Typ
2. Eine Adapterklasse und ein Adapterobserver pro Entity
3. Verzicht auf Typsicherheit
4. ?
Gruß
Ich habe eine Persistenzschicht die aktuell für 3 Typen X Y und Z verwendet wird.
Alle Typen in einer Klasse zu verwalten bietet sich an, da meine basisschicht nicht typsicher ist - ich kann also intern alle Klassen über einen Kamm scheren und spare gleichzeitig doppelten code.
Das Designproblem entsteht bei dem Interface der Persistenzeinheit, aktuell sieht es von den Schnittstellen etwa so aus:
-save(X);
-save(Y);
-save(Z);
-update(X);
-...
-remove(X);
weiterhin können observer hinzugefügt werden die über die Operationen der Typen informiert werden (z.B. kann ObserverX informiert werden wenn ein Objekt X gespeichert oder entfernt wird, gleiches für ObserverY und Observer Z).
In meiner Clientschicht macht sich das ganze sehr schön, eine View für X Y und Z implementiert einfach ObserverX, ObserverY und ObserverZ (die objekte gehören semantisch zusammen und müssen gemeinsam dargestellt werden) und registriert sich selbst für alle 3 Observertypen bei der Persistenzeinheit.
Dafür bekomme ich in der Persistenzeinheit logischerweise pro Entity redundanten Code.
Für den Architekturentwurf würde ich selber auf Generics zurückgreifen, mit einer generische Persistenzschicht die die Methoden
-save(T)
-update(T)
-remove(T)
-registerObserver(Observer<T>)
anbietet.
Dann muss allerdings meine tatsächliche Persistenzeinheit 3 fast identische adapterklassen beeinhalten, da ich nicht Persistence<X> Persistence<Y> und Persistence<Z> gleichzeitig implementieren kann.
Weiterhin kann mein view auch nicht Observer<X>, Observer<Y> und Observer<Z> implementieren.
Ich würde also auch hier jeweils einen Adapter benötigen.
Alternativ könnte ich meine typsicherheit über Bord werfen und einfach bei allen Client-Anwendungen casten was definitiv kein schöner Stil ist.
Was wäre eure bevorzugte Lösung?
1. Ein Observer und 3 fast identische Methoden pro Entity-Typ
2. Eine Adapterklasse und ein Adapterobserver pro Entity
3. Verzicht auf Typsicherheit
4. ?
Gruß