2016-05-14 52 views
0

我正在修復系統的OOP設計,因爲我認爲該體系結構存在缺陷。爲了正確的代碼重用和關係,我必須重寫正確的對象方向應用程序的類,例如繼承,接口和聚合/組合。應用OOP聚合概念的正確方法

說我有課程類,主題類,學年班,年級班,我想申請HAS-A聚集)的概念作爲

課程HAS-A主題 課程HAS-A年的水平 課程HAS-A學年 主題HAS-A學年 主題HAS-A年的水平

是否足夠做到這一點,如:

public class Curriculum { 

    SchoolYear schoolYear = new SchoolYear(); 
    YearLevel yearLevel = new YearLevel(); 
} 

或使用構造函數初始化:

public class Curriculum { 

    SchoolYear schoolYear; 
    YearLevel yearLevel; 

    public Curriculum(SchoolYear sy, YearLevel yl){ 
     this.schoolYear = sy; 
     this.yearLevel = yl; 
    } 

或者就像一個方法中創建類的實例:

public DefaultListModel getAllYearLevel(){ 
     YearLevel yl = new YearLevel(); 
     return yl.getAllYearLevels(); 
    } 

,我不認爲這是正確的,因爲我沒有看到重新創建相同的方法只是說課程類HAS-A YearLevel。

考慮到課程由年級,學科和學年組成,我如何實施或應用HAS-A概念?

在這一點上,我不能繼續使用setters和getters,因爲我不知道哪個方法是正確的。我希望能夠正確應用面向對象的概念。

我會很感激任何建議或幫助。

+0

#3不是聚合。一旦你返回它,你構造的新東西與它的「父」沒有更多的關係。在1到2之間,你可以辯論組合/聚合和關聯之間的差異,但這沒有意義。做適合自己情況的最佳方法。 – zapl

+0

這些SchoolYear和YearLevel構造函數沒有參數嗎?哪一年?哪個級別?這些價值對象還是可以共享並擁有自己的身份? – plalx

回答

0

第二種方法似乎是最好的方法,第一種和第三種方法似乎在不推薦的類之間有很多依賴關係。

請注意,SchoolYeal和YearLevel應該是接口或摘要,但不是執行,否則我們將仍然停留在依賴性問題。

+0

Wny不能實施嗎?我不會建議抽象類,因爲那麼你不能在問題 –

+0

中實現它們的想法是忽略對象的實現來減少兩個類之間的依賴關係。在第一種方法中,如果我們改變SchoolYear的實現方式,並且我們將用於檢驗新實現類「FutureSchoolYear」,我們需要在課程中改變它,另一方面,如果我們選擇第二種方法,SchoolYear作爲接口,我們只需要讓「FutureSchoolyear」實現這個接口。 抽象和接口是將對象與當前類連接的兩種方式,它取決於關係 –

1

「正確」的理念,爲協會聚集組成是所有關於生命週期和關係。所以最重要的問題是「哪些對象可以獨立於哪些對象存在?」和「兩個對象(A擁有-B,A知道B,A構成B)之間的關係有多強大?」

如果你想使用聚集理念,爲你的類Curriculum(作爲業主),這將意味着Curriculum將有一個SchoolYear,也將有一個YearLevel,但他們都有自己的生命週期。所以如果你摧毀Curriculum其他對象將仍然存在。這樣就可以實現像你的第二個方法:

public class Curriculum { 

    SchoolYear schoolYear; 
    YearLevel yearLevel; 

    public Curriculum(SchoolYear sy, YearLevel yl){ 
     this.schoolYear = sy; 
     this.yearLevel = yl; 
    } 
} 

如果你想他們之間更緊密的關係,你需要的組成概念,其中A-IS-由-的B上它們的生命週期是相同的。如果你摧毀了A,那麼你也摧毀了B,這意味着B不能在不屬於A的情況下存在。就像建築物由房間組成一樣,但是沒有建築物的房屋可以存在嗎? 要映射生命週期,您需要創建YearLevelSchoolYear,當您像第一種方法那樣實例化Curriculum時。

從我的意見你的罰款與這一個聚合。 如果您將Subjects添加到您的Curriculum中,您應該考慮使用合成。

+0

謝謝,很好的示例和表示。我明白了。 – p3ace