2017-04-21 74 views
0

我一直在構建RTS以提高Java技能。我一直在閱讀很多關於德米特法,因爲我想保持我的代碼清潔,但我仍然很困惑!目前,我有一些像這樣的代碼,在視圖中顯示有多少有一定的船舶中有選擇的星球上的艦隊:Demeter在Java中的法律

int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates(); 

,從我的理解違背迪米特法則。如果我只有'一個點',我必須在每個班級都有一種方法來從下一個中獲取信息嗎?看起來很麻煩。

+0

你可以閱讀一些意見[here](http://stackoverflow.com/問題/ 468615 /如何解決違反法律的規則?rq = 1) –

回答

2

Law Of Demeter致力於遵循信息隱藏原理來減少對象之間的耦合。在您的例子包含該語句的方法m

int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates(); 

有興趣的只有Frigates數量。但方法調用鏈將方法mT類型的m耦合到由getSelectedPlanet()getFleet()返回的類型。

一個解決方案,以避免此介紹的依賴將是一個方法添加到您的model直接返回像當前選擇的平面的護衛艦數量:

int numberOfFrigates = model.getNumberOfFrigates(); 

但多數情況下主要的侵犯,是一個糟糕的設計或責任錯位的指標。這個問題的真正解決方案很可能不是直接向消費​​者公開從方法鏈獲得的信息,如上面所示的示例,而是通過將處理的部分或整體責任移動到接近所需信息的對象。

爲了儘量具體,我可以在你的榜樣,問自己:

爲什麼我需要在我的方法m護衛艦的數量?

我可以移動在m中完成的部分處理嗎?更接近PlanetFleet的類型?

這樣你就可以避免方法鏈了。

+0

但是然後模型不會有這樣的方法: int getNumberOfFrigates(){return selectedPlanet .getFleet()getNumberOfFrigates(); } 這也打破了法律? –

+0

我擴展了我的答案,希望你能找到一個合適的解決方案。你打算如何處理'm'中的'numberOfFrigates'?我的擴展解釋對你有幫助嗎? – Harmlezz

0

你在這裏做的是暴露內部狀態,在POO中,你不需要獲得對象的內部狀態來獲取它的信息。所以它可能應該是model.getSelectedPlanetNumberOfFrigates(),並且在對象中你可以處理對selectedPlanet.getFleetNumberOfFrigates()的調用,等等...