2010-10-26 317 views
8

這裏的數據是該方案,如何分離業務邏輯

比方說,我有一個用戶類,像這樣:

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

然後,我必須像這樣來處理用戶評論類:

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

到目前爲止非常基本的東西。但是,我想添加一些幫助程序,以便更輕鬆地爲用戶加載註釋。所以我可以在User類中創建一些東西:

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

我認爲這是一種不必繞過用戶實例的簡單方法。但在這一點上,我很不高興,因爲我已經將用戶bean對象與加載評論的業務邏輯耦合起來。我也保存了用戶類中不應該屬於的默認計數。那麼做到這一點的最好方法是什麼?我的目標是將此對象傳遞給jsp,以便可以調用JSTL函數。我有一個想法,創建一個UserWrapper,看起來像這樣...

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);} 
} 

我希望我很清楚。我不喜歡使用useBean標籤,因爲它不需要這樣的東西。我希望有一個更清晰的方法來處理這樣的事情!任何幫助,將不勝感激!

編輯:有一件事我忘了提及。我希望能夠在JSTL中使用此代碼。這意味着它必須是一個吸氣。 DAO模型是衆所周知的,但當我的前端開發人員需要編寫一個腳本時,它並沒有太多幫助,或者我需要將它加載到他可能需要或不需要的地方。

+0

嗯,想到它後嗯。我認爲一個更好的問題是,通常DAO都是靜態函數。如果必須將一個參數傳遞給每個函數,會發生什麼情況。讓我們說一個oAuth標記。我認爲在這種情況下,不要只將DAO設爲靜態並使其接受令牌作爲構造函數是有意義的。像新的UseDao(String token);有什麼想法嗎? – 2010-10-27 00:09:20

+0

嗯答案接受:P – 2010-10-28 00:18:26

回答

3

從技術的獨立立場點...

是的,你是絕對正確的耦合是望而卻步。請參閱Layers architectural pattern以提供關於結構業務邏輯和數據的一些指導。例如,設計兩個子系統可能是一個好主意:一個用於邏輯,另一個用於圖層。通過僅限於限制它們之間的通信,允許邏輯將消息傳遞到數據層。此外,您可以使用Facade pattern來表示每個子系統,從而減少耦合甚至更多。將每個圖層視爲黑匣子。

可能派上用場的另一種模式是Data Access Object pattern。它將幫助您定義圖層之間的合約,以便在必要時傳遞數據。

+0

有些時候有一個DAO只是一個矯枉過正。比方說,我有評論,通知,電子郵件,狀態更新等......創建一個龐大的文件只是加載這些數據並不那麼幹淨。另外我不能直接從jsp調用它。我忘了提及,一個目標是編寫更少的代碼!哈哈。我可以創建立面,DAO,並且只是爲了找到一個巨大的噩夢來管理。 – 2010-10-26 19:28:26

+2

然後嘗試增量開發。在紙上做好計劃,看看是否所有東西都檢查完畢(找一個朋友確保你的設計是理智的)。你絕對正確。精益設計是最好的。但要確保它做到了你想要的一切,並且它是鬆散耦合的。很簡單,對吧? :) – Mike 2010-10-26 19:52:51

+0

+1邁克。 @Amir - 關於架構的東西是想知道你想要/需要去應用程序的位置;這與YAGNI非常不同。我發現(一般情況下)一旦你採用像邁克斯這樣的方法,你很快就會熟悉它,而'管理'問題就會有效地消失。 – 2010-10-26 22:22:40

2

我喜歡爲此使用數據訪問對象(DAO)。您的UserComment類將只包含這些對象的字段,然後創建單獨的類以檢索有關這些對象的數據。 DAO是你包含如何檢索,更新,選擇等邏輯的地方。例如,

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 
    }