2010-11-23 54 views
4

我在一個應用程序中作爲一個愛好項目工作。它是用Java編寫的,也是系統的一部分,用於計算水肺潛水的減壓方案。 我的問題是在存儲我的潛水計劃的課程中,以及它並不是一個真正的問題,因爲它工作正常,但我的感覺可以設計得更好,所以我想問一些反饋。Java設計問題

我現在得到的是以下內容。

A類DivePlan其中有DiveOpperations(ArrayList<DiveOpperation>)的ArrayList。 DivePlan類有3個功能。一個計劃下降,一個計劃上升,一個計劃在相同深度的平坦下潛。所有這些函數都會將一個DiveOpperation對象添加到ArrayList。然而,攀登和下降有一些其他屬性作爲一個潛水保持在同一深度。例如,以m/s的上升/下降速度。我現在把它的速度設置爲0,但這不太合適。我知道我應該分開課程來擴展DiveOpperation,但這樣我不知道它是否是ascentdescentflatdive類,當我把它從數組中取出時。

什麼是這樣的功能的好設計?

+1

這是不可能回答的。這聽起來像你的一般做法是相當不錯的,並沒有什麼固有的錯誤,使平坦的部分是一個/下降速度爲0 – Falmarri 2010-11-23 19:37:29

+0

請注意,如果您允許別人使用您的代碼,並作爲如果您提供不正確的潛水計劃導致受傷,您可能會承擔法律責任。 – 2010-11-23 19:42:13

回答

1

讓一個verticalSpeed變量決定如何?

值爲0DiveOperation代表一個積極的態度,它的正值或負值分別表示上升或下降?

如果您有其他性質不僅僅是上升/下降的速度,你可能想轉成DiveOperation一個抽象類,並創建三個subclases AscentOperationDescentOperationFlatDiveOperation。如果我正確地理解了你,但是你有例如迭代的麻煩,因爲你不知道DiveOperation的實際類型。這可以通過使用大量instanceof檢查(醜陋!)或使用visitor pattern(更好的IMO)來解決。在這種情況下,你可能會有類似DecompressionCalculatorVisitor的東西,它們依次訪問每個DiveOperation

查看我的回答over here瞭解訪問者模式的詳細示例。

+0

是的,這是我現在得到的,但我想知道是否有更好的設計。上升和下降也有不同的開始和結束深度,這對一個flandive來說是一樣的。我使用不同的函數來計算不同類型所需的解壓縮。 – 2010-11-23 19:38:57

0

我不確定我是否明白你的問題,但 1.我不認爲你必須知道什麼是DiveOperation的真正類型。使用命令模式並調用命令方法。該命令將完成其工作。 2.如果您仍然需要知道該類型,可以使用instanceof運算符來檢索它。

2

對此的多態解決方案是將DiveOperation類擴展爲AscentOperation,DescentOperation和FlatOperation,並保持現有的ArrayList輸入。鑑於執行過程的簡單程度,我不確定你需要在這裏做到這一點。

如果需要增加複雜性來容納更多可以更容易重構的功能,那麼您最好爲您的計算開發一組好的單元測試。

0

擴展它。您可以通過從陣列中獲取它,然後檢查(object instanceof AscentDive)等來確定它是哪個子類(上升,下降,平坦)。

請記住,泛型在運行時會被擦除。所以你在現實中定義的ArrayList只包含從JVM角度來看的「Objects」。通用編譯時驗證。如果您將子類DiveOperation並定義爲ArrayList<DiveOperation>,則始終可以將子類添加到該列表中。