2012-12-31 37 views
0

我反覆遇到類似這樣的場景模式:如何OO場景

一個集裝箱業務類模型的層次結構。

參與此層次結構並由上述類聚合的業務類。

讓我給你舉個例子。

A Map有國家。現在Map應該知道每個Country在哪裏,因爲除了包含所有國家之外它的主要責任是知道每個國家的位置和鄰近。從這個角度來看,功能如isNeighbour(Country A, Country B)似乎是Map的正確補充。但是,每個國家還應該提供一種方法來了解一個國家是否在附近。說spain.isNeighbour(italy)。這確實有用。現在,如果我不想重複功能和責任性,我應該採取什麼方法?

我正在學習的當前例子對於我的大學來說很重要,每門課程都需要其他課程,並且會阻止下一個課程。專業是包含所有課程和決定哪個課程在哪個課程之前的課程。說我要添加課程在彼此的依賴,例如,參加微積分2,你需要微積分1 ...我應該去calculus.addRequired(calculus2),然後將它傳遞給主要對象,或者也許computerScience.addRequired(calculus1, calculus2) ...

我不我不想有兩種選擇,因爲對我來說,它似乎會導致錯誤,但同時我希望每門課程都能夠回答它的要求。我真的不知道如何正確分配責任。

+0

這是綁定到數據持久性/數據庫還是全部在內存中? – Euphoric

+0

堅持持久。 – arg20

回答

2

首先是,互相呼叫沒有問題。

你可以有

boolean Map.isNeighbour(Country A, Country B) { return A.isNeighbour(B); } 

boolean Country.isNeighbour(Country other) { return map.isNeighbour(this, other); } 

二似乎需要參照世界地圖。首先使地圖看起來像簡單的外觀。

第二件事是你說它被堅持。創建一個服務也可能是個好主意,它將使用相關參數查詢DB。這可以是Map或某個存儲庫服務。這也可以讓你查詢實體的唯一身份(例如countryId)而不是完整的對象。

我相信這兩種解決方案都不會更好或更糟。只有不同點是其他開發人員期望定位方法的地方。但是當我思考這個問題時,這意味着Map將承擔國家的所有責任,從而打破SRP,特別是如果它不是通過國家的方法。

1

我會把isNeighbour()方法寫入CountryCountry將包含鄰居的地圖。然後容器可以在相關的國家/地區實例上調用此方法。

這種方式的邏輯由各國維護,容器只是代表向他們回答問題。

在課程的情況下,在Major-1中可能需要Course-1,而不是Major-2。在這種情況下,我會引入另一個課程,例如CourseInMajor包含給定專業中給定課程所需的課程。