2016-04-21 48 views
1

可以說我有一個表示課程的類。課程具有自己的屬性,如主題名稱,描述,開始和結束日期等。在哪個類中「應該」負責將數據從數據訪問層(RDD)中提取

然後,該課程具有參與者列表的屬性。在數據庫中,這顯然表現爲兩類:該課程和參與者表以一對一的關係。

我的問題是關於如何設置課程類中的參與者列表:它應該是課程類本身提取數據(通過數據訪問層或上面的圖層),還是應該委託抓取和參與者設置某種幫助類,使課程類自己或多或少是一個愚蠢的對象,只有數據?

在RDD(Resopnsible驅動設計)中,它告訴我們要製作智能對象並將數據和行爲之間的差異抽象出來。在這方面聽起來很明顯,課程班應處理參與者的提取。這樣做是爲了提高對數據訪問對象(或上面的級別)的直接依賴,使其更加耦合起來。

任何想到這一點都會有所幫助。

+0

你可能想看看http://programmers.stackexchange.com這是很大的設計討論。 –

+0

感謝您的輸入! – Fred

+0

@ChrisWohlert在引用其他網站時,指出[交叉發佈被皺起了眉頭](http://meta.stackexchange.com/tags/cross-posting/info)通常很有幫助 – gnat

回答

0

課程類不應該負責提取參與者,實際上,它不應該負責提取課程。您提出了數據訪問層的正確點,但課程類本身不應與此層一起工作,它只能代表一門課程。

您創建了一個負責提取數據的類,即數據訪問層。你可以命名這個類似於CourseDao的東西,但重要的部分是;它只是從數據庫獲取數據,並以課程形式將其返回給客戶端。 該類具有創建,讀取,更新和刪除等方法。

現在,您想爲參與者做同樣的事情,只需要一個小小的差異。由於您的Participant表具有課程的外鍵,因此您的ParticipantDao將具有超載的Read。

例子:

public class ParticipantDao{ 
    public void create(Participant participant){ 
     //Insert participant in db 
    } 
    public Participant read(int id){ 
     //read participant from db 
    } 
    public List<Participant> read(){ 
     //read all participants from db 
    } 
    public List<Participant> read(Course course){ 
     //read all participants in this course from the db 
    } 
    public void Update(Participant participant){ 
     //update and so on. 
    } 
} 

而且你CourseDao可以去像使用ParticipantDao:

foreach(Course course in read()){ 
    course.setParticipants(this.participantDao.read(course)); 
} 

總之,你有一個對象來訪問數據庫中的數據,這是不表示所述數據的相同對象。當你有一對多關係時,這些訪問對象可以一起工作來檢索正確的數據。

+0

嗨,謝謝你的回答!然後,您還可以在上面的對象上使用「包裝器方法」,以獲取課程和參與者數據,這些數據將與參與者創建一個課程對象,使其成爲「智能/域對象」,同時不負責讀取/設置數據。 – Fred

2

它應該是過程類本身被獲取數據

這是已知爲Active Record的圖案。請注意,許多人認爲活躍記錄是anti-pattern

還是應該一個委託的抓取和參與者的某種輔助類

此的設置是被稱爲Repository模式。

使課程課程成爲自己或多或少是一個愚蠢的對象,只保存數據?

刪除從實體保存和檢索數據的責任不會使該實體成爲一個愚蠢的對象,只保存數據。實體仍然可以保存域邏輯,這在練習Domain-Driven Design時是很常見的做法。在DDD中,作爲簡單數據容器而沒有行爲的實體稱爲anemic domain model

+0

因此,簡而言之,一個好的方法是使用Repository模式? – Fred

+1

@Fred:這取決於你。你應該通過閱讀和理解這些模式進行調查並作出有教育的決定。 – Steven

相關問題