2014-10-16 68 views
2

這感覺就像這樣一個基本的問題,但這是所有新的給我:的Java:複製的方法

我有一個Person和房類,它們都有項目對象的列表。

public class Person{ 
    private ArrayList<Item> items; 

    public Person() { 
    items = new ArrayList<>(); 
    } 

    public void addItem(){ 
    ... 
    } 

    public void removeItem(){ 
    ... 
    } 

}  

public class Room { 

    private ArrayList<Item> items; 

    public Room() { 
    items = new ArrayList<>(); 
    } 

    public void addItem(){ 
    ... 
    } 

    public void removeItem(){ 
    ... 
    } 

} 

項目方法例如addItem()被複制在Room類和Person類中,這不是很好。我考慮製作一個單獨的庫存類,其中包含物品和物品方法列表,然後每個房間和人員都有庫存。

但後來我就沒法如果我使用一個私人庫存外地調用從一個人或房項目的方法。

什麼是停在這裏重複的最好方法?提前致謝!

+2

您可以在委託給清單對象的Person和Room類中創建適當的方法。 – 2014-10-16 21:09:58

+0

您的解決方案似乎是正確的方法。我會說你嘗試實現總體設計模式。也許這些thougts幫助一點點:http://commons.oreilly.com/wiki/index.php/Use_the_Aggregate_Design_Pattern_to_Reduce_Coupling – 2014-10-16 21:30:54

回答

7

你說得對。製作單獨的庫存類將是一個很好的面向對象設計。

我很高興你沒有說讓父類成爲RoomPerson,因爲雖然這樣可以爲你節省重複,但房間和人的關係並不相關,所以它們不應該在面向對象的意義上相關無論是。

您可以使用代表團委派添加/刪除項目的Inventory領域。

public class Room { 

    private Inventory inventory = new Inventory(); 

    public void addItem(Item item) { 
     inventory.addItem(item); 
    } 

    public void removeItem(Item item) { 
     inventory.removeItem(item); 
    } 
} 

編輯

有人提議露出庫存,然後有一個公共的添加/刪除對person.getInventory().addItem(item)方法。我認爲,這將違反Law of Demeter

+1

+1。關於你的「編輯」:我認爲這取決於實際的域名,不管這是否違規。 「給我你的庫存,並讓我添加/刪除項目」可能是在某些領域的語義上正確的操作,而在其他領域,它不會。對於初學者來說,一個好的測試可能會問:「人」是否有*庫存?或者是否恰好在內部使用? – 5gon12eder 2014-10-16 21:22:55

+0

謝謝!我想過這樣做,但想知道是否還有其他方法。但現在我認爲你的方式可能是最好的。 – mmgro27 2014-10-16 21:24:16

0

我認爲庫存班是去這裏最好的方法。您可以通過爲PersonRoom內的庫存創建一個吸氣劑來使用物品方法。

+0

這似乎不是一個很好的解決方案給我。以這種方式使用吸氣劑是個好主意嗎? – mmgro27 2014-10-16 21:13:06

+1

您可以像其他人所建議的那樣使用委託方法,但我沒有看到使用清單的問題。庫存類將有一個私有的'ArrayList'和用於添加和移除項目的公共方法。 – dramzy 2014-10-16 21:15:18

+0

通過不使用getter並委託給Person或Room類,您可以更好地封裝,因爲您沒有透露有關項目如何存儲到調用者的詳細信息。 – Mark 2014-10-16 21:16:45

0

根據您的業務領域是什麼,你可以有一個抽象的存儲容器類太多,他們都繼承。抽象存儲容器上會有方法,所以你仍然可以直接調用它們。

你也可以給這兩個類IStorageContainer的空白界面,然後創建與參加了IStorageContainer的第一個參數一個靜態方法一個新的靜態類。

然後,你可以調用的AddItem(thisPerson,項目)和removeItem(thisPerson,項目),但能夠重用這兩個類這兩種方法,使用相同的代碼和實施。