2010-10-26 22 views
8

Ecco lo scenario,come disaccoppiare i dati di business logic

Diciamo che ho una classe utente in questo modo:

public class User{ 
    private String firstName; 
    private String lastName; 
//... 
// setter, getters 
} 

Poi ho una classe in questo modo di gestire Commenti utenti:

public class Comments{ 
    // some fields 
    public static loadComments(User user, int count){...} 
} 

Finora cose molto di base. Tuttavia, voglio aggiungere naturalmente degli helper per rendere più semplice il caricamento dei commenti per l'utente. Così ho potuto creare qualcosa nella classe User:

final static int defaultCount = 10; 
... 
public Comment comments(){ 
    return Comments.loadComments(this, defaultCount); 
} 

Penso che questo sia un modo semplice per non dover passare attorno alle istanze degli utenti. Ma a questo punto, sono infelice perché ho accoppiato il mio oggetto bean utente con la logica di business che carica il commento. Ho anche salvato il conteggio predefinito in user class che non dovrebbe appartenere a questo. Quindi qual è il modo migliore per farlo? Il mio obiettivo è passare questo oggetto a un jsp in modo da poter chiamare le funzioni JSTL. Mi è venuta l'idea di creare un UserWrapper che assomiglierebbe a questo ...

public class UserWrapper{ 
    private final static defaultCount = 10; 
    private final User user; 
    public UserWrapper(User user){ 
    this.user = user; 
    } 

    // should probably cache this but i am not going to show this for simplicity 
    public Comments getComments(){return Comments.loadComments(user, 10);} 
} 

Spero di essere stato chiaro. Non mi piace usare il tag useBean perché non è necessario per qualcosa di simile. Spero che ci sia un modo più pulito per avvicinarsi a qualcosa del genere! Qualsiasi aiuto sarebbe apprezzato!

Modifica: Una cosa che ho dimenticato di menzionare. Voglio poter usare questo codice in JSTL. Il che significa che deve essere un getter. Il modello DAO è ben noto, ma non aiuta troppo quando il mio sviluppatore front-end ha bisogno di scrivere uno scriplet o ho bisogno di caricarlo per i posti che potrebbe o non potrebbe aver bisogno.

+0

Hmmm dopo averci pensato. Penso che una domanda migliore da porre sia che solitamente i DAO sono tutte funzioni statiche. Cosa succede se devi passare un parametro ad ogni funzione. Diciamo un token oAuth. Penso che in tal caso, avrebbe senso non rendere solo statico DAO e renderlo accettabile come costruttore. Come nuovo UseDao (token stringa); qualche idea? –

+0

hmmmm che risponde ad accettare: P –

risposta

3

da una tecnologia di stand-point indipendenti ...

Sì, hai assolutamente ragione su questo accoppiamento essere proibitivo. Guardare allo Layers architectural pattern per offrire indicazioni sulla logica e i dati aziendali della struttura. Ad esempio, potrebbe essere una buona idea progettare due sottosistemi: uno per la logica, l'altro per i livelli. Limitare la comunicazione tra di loro tramite solo consentendo alla logica di passare i messaggi al livello dati. Inoltre, è possibile utilizzare Facade pattern per rappresentare ciascun sottosistema e quindi ridurre ulteriormente l'accoppiamento. Tratta ogni livello come una scatola nera.

Un altro modello che potrebbe tornare utile è lo Data Access Object pattern. Ti aiuterà a definire un contratto tra i Layer per passare i dati quando è necessario.

+0

Alcune volte avere un DAO è solo un eccesso. Diciamo che ho avuto commenti, notifiche, e-mail, aggiornamenti di stato, ecc ... La creazione di un file enorme basta caricare questi dati non è così pulito.Inoltre non potrei chiamarlo direttamente da jsp. Ho dimenticato di menzionare, un obiettivo è scrivere meno codice! haha. Posso creare facciate, DAO e solo per trovare un enorme incubo da gestire. –

+2

Prova quindi lo sviluppo incrementale. Pianificalo bene sulla carta e controlla se tutto è in ordine (chiedi a un amico di assicurarti che il tuo design sia sano di mente). E hai assolutamente ragione. Il design snello è il migliore. Ma assicurati che faccia tutto ciò che vuoi e che sia liberamente accoppiato. Facile, giusto? :) – Mike

+0

+1 Mike. @Amir - il bello dell'architettura è avere un'idea di dove vuoi/devi andare con l'app; questo è molto diverso da YAGNI. Ho scoperto che (in genere) una volta adottato un approccio come Mikes, si acquisisce rapidamente familiarità con esso e il problema della "gestione" scompare in modo efficace. –

2

Mi piace utilizzare Data Access Objects (DAO) per questo. Le tue classi User e Comment conterranno solo i campi per tali oggetti e quindi creerai classi separate per recuperare i dati relativi a tali oggetti. I DAO sono dove si include la logica su come recuperare, aggiornare, selezionare, ecc. Ad esempio,

public class UserDAO { 

    public UserDAO() { 
     //maybe setup a Hibernate connection or JDBC connection here 
    } 

    public User getUser(int userId) { 
     User user; 
     //code to retrieve user from datasource 
     return user; 
    } 

    //other methods for update, delete, select, etc 
    } 

    public class CommentsDAO { 
    private static int DEFAULT_COUNT = 10; 

    public CommentsDAO() { 
     //maybe setup a Hibernate connection or JDBC connection here 
    } 

    public Collection getCommmentsForUserWithCount(User user, int count) { 
     Collection comments = new Set(); 
     //retrieve comments from datasource limit to count 

     return comments; 
    } 

    public Collection getCommentsForUser(User user) { 
     return getCommentsForUserWithCount(user, DEFAULT_COUNT); 
    } 

    //other methods for update, delete, etc 
    } 
Problemi correlati