2013-02-06 36 views
1

(我使用的Java,因此添加了「Java」作爲標籤櫃面它影響任何答案,但有些人可能會爭辯說,標籤是不必要的。)

股票列表 - 多態性設計

考慮以下:

我有一個陽臺/陽臺來圖形計劃。作爲最終計劃的一部分,我需要列出構建陽臺所需的任何材料。爲了簡化計算處理我已經分裂廡成不同

甲板以上 - 其中涉及塑料柵欄組件和固定件(即螺釘,螺栓)
甲板下 - 其涉及木材子幀和更多的固定。

...加上其他我不會深究的東西。


爲了討論:有可由於我們提供不同的擊劍設計100個不同的股票項目。每個項目都有其自己的類別,包括諸如尺寸,顏色,數量和ID參考等信息。

我想要做的是創建每個部分所需的修復列表,並將它們全部添加到最終列表中,而不會有任何重複。
最後的想法是顯示已處理計劃旁邊的項目名稱和數量。


因此,例如:

第1節要求:
- 25×螺絲A
- 15×螺絲B
- 5×螺絲C

第2節需要:
- 25×螺桿
- 15×螺絲B
- 5 x螺絲˚F

第三節要求:
- 45×螺絲B
- 50 x Screw C
- 24 x Screw G

總計列表
科1 +第2節+第3節= {材料全部名單}


我已經試過/考慮:

所有我已經螺絲上面提到的都有自己的班級,並且擴展了超級班「緊固件」。上述各有一個變量:

ArrayList<Fasteners> 

所以當我計算我可以添加的螺絲這個變量。一旦每個部分計算出需要的緊固件數量,我就把它們加在一起。

我曾考慮在「緊固件」超類中添加任何重複項目的「添加(修復)」方法。但是因爲有100個項目,我認爲編碼效率不高,並且懷疑有更好的方法來利用我在這裏設置的多態性。任何在線參考或提示將會有所幫助,並且非常感謝。

回答

1

這裏有一個建議:

請叫FastenerType枚舉,然後使用握住你的緊固件。我們稱之爲包包。

然後像做

public class FastenerBag { 

    private Map<FastenerType, AtomicInteger> fasteners = new EnumMap<FastenerType, AtomicInteger>(FastenerType.map); 

    FastenerBag(){ 
    // init your ints to zero 
    } 

    public void addFastenersFor(VerandaPart part){ 
    for (FastenerType type : FastenerType.values()){ 
     fasteners.get(type).addAndGet(part.getRequiredFasteners().get(type)); 
    } 
    } 

} 

不要擔心太多性能。首先讓它工作。然後讓它可讀(重構),然後優化。

+0

謝謝您的回覆。我不熟悉Enum和EnumMap。我做了一個快速搜索,聽起來很有希望。我會深入研究這個問題並回復你。 – cworner1

+0

您是否使用AtomicInteger,因爲我可能正在使用線程? 「int」否則就足夠了? – cworner1

+0

我用它,因爲你需要一些東西來包含int;你也可以使用整數並且隨時都可以得到它們,但是這更簡潔。我使用了AtomicInt,因爲它存在,我很懶惰:)當然,你可以編寫自己的。 –