有個很有趣的問題,當實體中不是以聚合而是以查詢的方式會出現什麼讓我們忽視的問題。

gamex發表於2009-10-17
還是續上次與banq討論的那個問題
ForumBoard與ForumSubject是一對多的關係如果設計成聚合便是
ForumBoard{
private List<ForumSubject> forumSubjects;
public List<ForumSubject> searchSubjectByTitle(String title)
//這個便是根據聚合內元素來找尋相應的ForumSubject物件
}
但如果遇到大資料量時與聚合的方式設計便是不太適合這時候我們便會想到以查詢的方式不管事透過直接Repository還是
間接的DomainEvent模式還是什麼的這個方法變成了查詢來load這個物件
設計可能變成這樣
ForumBoard{
private String title;
public List<ForumSubject> searchSubjectByTitle(String title){
//透過某種方式從資料庫中load出物件
}
}
ok我透過我們設計做到了這點,但是有意思的問題總是藏得很深,深到讓你不容易發現。我發現這個問題也是在同事的使用當中發現的。
先看主題物件的結構
ForumSubject{
private String title;
private ForumBoard forumBoard;//這是個與板塊之間的關聯
public getForumBoard(){...};
}
好有趣的程式碼來了
ForumBoard 板塊 = loadForumBoard()從資料庫中load出ForumBoard
ForumSubject 主題 = 板塊.searchSubjectByTitle("某某主題");
ForumBoard forumBoard = 主題.getForumBoard();
forumBoard.title = "修改了板塊名";
assertEquals(forumBoard.title,板塊.title); //你猜會是什麼事情發生。不相等。
//答案就是當searchSubjectByTitle是以查詢的方式load物件時,我實際上是重現構建了個新的ForumSubject和ForumBoard之間的關係。他與原先的 板塊 物件之間是脫鉤的,這就使得 原先的 板塊 物件 與 重新load出來的ForumSubject物件內的板塊物件之間不存在任何關係。這就引申了個問題,當物件是聚合關係的時候我們ForumBoard物件內的引用關係是存在的,如果換成查詢的話這種關係便打破了。
也許這時候會有朋友站出來說可以再把他補回去嗎,如下:
ForumBoard{
private String title;
public List<ForumSubject> searchSubjectByTitle(String title){
//透過某種方式從資料庫中load出物件
ForumSubject 重建出來的板塊 = ForumSubject.getForumBoard();
Equals(重建出來的板塊,this)//對比下兩是否相等如果相等替換
ForumSubject.setForumBoard(this);
//這裡替換,但是如果我們找出來的資料量大呢,那我們這樣做所帶來的時間上的耗費將有多大
}
}
有趣吧,希望大家一起來研究看看有啥好的主意沒。




相關文章