Beim selber Entwickeln von neuen Dingen kommen bei mir immer wieder Fragen über gewisse Design-Fragen auf.
Ich würde hier gerne die eine oder andere stellen und hören, was Ihr so dazu denkt. An sich sind es sehr simple Sachverhalten.
Konkret:
1. Ich benutze in meiner Webanwendung jetzt noch das mir bekannte Controller - Service - DAO Pattern. Controller nutzen die Services, um die benötigen Daten für den request aufzubereiten.
Die Services machen dabei alle nötige Business-Logik. Die DAOs nur die reinen Queries an die DB.
Jetzt gibt es aber manchmal den Fall, dass das Holen von gewissen Daten einfach zu 100% vom DAO erledigt wird und der Service dann nichts anderes machen würde, als die Methode des DAOs zu wrappen und genau das gleiche zu returnen. Das fühlt sich irgendwie immer komisch und falsch an.
Die Alternative wäre es, dass der Controller direkt auf das DAO zugreift. Das ist aber noch schlechter, imho, weil dann der Controller manchmal den Service und manchmal das DAO direkt verwendet. Das fühlt sich irgendwie auch falsch an.
Also was macht man? Akzeptiert man, dass manche Methoden des Services nichts anderes machen, als die des DAOs zu wrappen? Ist das OK?
2. Wie geht man mit den unterschiedlichen Sichten/Ausschnitten der Daten um? Mir fällt auf, dass ich oft in verschiedenen Teilen der Anwendung nur eine gewisse Teilmenge der Daten einer Klasse brauche.
Beispielweise würde ich gerne in meiner Session die Informationen "Vorname", "Nachname", "E-Mail" des aktuellen Nutzers hinterlegen, nicht aber den Rest wie "Straße", etc.
Also definiere ich dazu ein neues Bean, nenne es UserSessionBean oder ähnlich. Dann hätte ich noch gerne eines für die Registrierung, also habe ich nun auch ein UserRegisterBean.
Das häuft sich irgendwie und irgendwann hat man ne ganze Menge von Beans, die sich alle um sehr ähnliche Daten drehen.
Gibt es da einen besseren Weg oder wie würdet Ihr das machen?
3. Bei dem "UserSessionBean" von Punkt 2 - würdet ihr dort dem DAO eine Methode geben, das eine Instanz von so einem Bean zurück gibt? Also das DAO direkt bietet eine eigene Methode für genau nur diese Daten an? Oder würdet ihr das DAO nur eine Methode zum Zurückgeben eines ganzen User's geben und dann im Service eine Methode definieren, die diesen User in ein UserSessionBean umwandelt und zurück gibt?
Also (mehr oder weniger Kombination aus allen 3 Fragen):
versus
Ich würde hier gerne die eine oder andere stellen und hören, was Ihr so dazu denkt. An sich sind es sehr simple Sachverhalten.
Konkret:
1. Ich benutze in meiner Webanwendung jetzt noch das mir bekannte Controller - Service - DAO Pattern. Controller nutzen die Services, um die benötigen Daten für den request aufzubereiten.
Die Services machen dabei alle nötige Business-Logik. Die DAOs nur die reinen Queries an die DB.
Jetzt gibt es aber manchmal den Fall, dass das Holen von gewissen Daten einfach zu 100% vom DAO erledigt wird und der Service dann nichts anderes machen würde, als die Methode des DAOs zu wrappen und genau das gleiche zu returnen. Das fühlt sich irgendwie immer komisch und falsch an.
Die Alternative wäre es, dass der Controller direkt auf das DAO zugreift. Das ist aber noch schlechter, imho, weil dann der Controller manchmal den Service und manchmal das DAO direkt verwendet. Das fühlt sich irgendwie auch falsch an.
Also was macht man? Akzeptiert man, dass manche Methoden des Services nichts anderes machen, als die des DAOs zu wrappen? Ist das OK?
2. Wie geht man mit den unterschiedlichen Sichten/Ausschnitten der Daten um? Mir fällt auf, dass ich oft in verschiedenen Teilen der Anwendung nur eine gewisse Teilmenge der Daten einer Klasse brauche.
Beispielweise würde ich gerne in meiner Session die Informationen "Vorname", "Nachname", "E-Mail" des aktuellen Nutzers hinterlegen, nicht aber den Rest wie "Straße", etc.
Also definiere ich dazu ein neues Bean, nenne es UserSessionBean oder ähnlich. Dann hätte ich noch gerne eines für die Registrierung, also habe ich nun auch ein UserRegisterBean.
Das häuft sich irgendwie und irgendwann hat man ne ganze Menge von Beans, die sich alle um sehr ähnliche Daten drehen.
Gibt es da einen besseren Weg oder wie würdet Ihr das machen?
3. Bei dem "UserSessionBean" von Punkt 2 - würdet ihr dort dem DAO eine Methode geben, das eine Instanz von so einem Bean zurück gibt? Also das DAO direkt bietet eine eigene Methode für genau nur diese Daten an? Oder würdet ihr das DAO nur eine Methode zum Zurückgeben eines ganzen User's geben und dann im Service eine Methode definieren, die diesen User in ein UserSessionBean umwandelt und zurück gibt?
Also (mehr oder weniger Kombination aus allen 3 Fragen):
Java:
public class UserService {
public UserSessionBean getUserSessionData(final String userID) {
return this.userDAO.getUserSessionData(userID);
}
}
public class UserDAO {
public UserSessionBean getUserSessionData(final String userID) {
// nur 3 Felder aus der Datenbank holen und in ein UserSessionBean packen
}
public User getUser(final String userID) {
// alle Felder aus DB holen und in einen User packen
}
}
versus
Java:
public class UserService {
public UserSessionBean getUserSessionData(final String userID) {
User user = this.userDAO.getUser(userID);
UserSessionBean userSessionData = new UserSessionBean();
userSessionData.setFirstname(user.getFirstname());
// ...
return userSessionData;
}
}
public class UserDAO {
// nur diese Methode
public User getUser(final String userID);
}
Zuletzt bearbeitet: