我目前正在設計我的類時遇到循環依賴關係問題。自從我閱讀了關於Anemic Domain Model(我一直在做的事情)之後,我一直試圖擺脫創建只是「getters和setter桶」的域對象,並返回到我的OO根。面向對象設計和循環依賴關係
但是,下面的問題是我遇到了很多,我不知道我應該如何解決它。
假設我們有一個團隊類,即有很多玩家。無論這是什麼運動都無所謂:)一個球隊可以添加和移除球員,就像球員可以離開球隊並加入另一個球員一樣。
因此,我們有團隊,其中有球員名單:
public class Team {
private List<Player> players;
// snip.
public void removePlayer(Player player) {
players.remove(player);
// Do other admin work when a player leaves
}
}
然後我們有播放器,它具有對團隊參考:
public class Player {
private Team team;
public void leaveTeam() {
team = null;
// Do some more player stuff...
}
}
我們可以假定這兩個方法(移除和離開)具有領域特定的邏輯,當團隊移除球員並且球員離開球隊時需要運行領域特定的邏輯。因此,我首先想到的是,當團隊踢的球員,removePlayer(...)也應調用player.leaveTeam()方法...
那麼是什麼,如果球員是驅動離開 - 應該leaveTeam()方法調用team.removePlayer(this)?不是沒有創建一個無限循環!
在過去,我只是讓這些對象「啞」POJOs和有一個服務層做的工作。但即使是現在我還是留下了這個問題:爲了避免循環依賴,服務層仍具有鏈接它一起 - 即
public class SomeService {
public void leave(Player player, Team team) {
team.removePlayer(player);
player.leaveTeam();
}
}
我是不是在複雜嗎?也許我錯過了一些明顯的設計缺陷。任何反饋將不勝感激。
感謝所有的回覆。我接受Grodriguez的解決方案,因爲它是最明顯的(不能相信它不會發生在我身上)並且易於實現。然而,DecaniBass確實是一個很好的觀點。在我所描述的情況下,球員可能會離開球隊(並且知道他是否在球隊中)以及推動球隊移動的球隊。但我同意你的觀點,我不喜歡這個過程中有兩個「切入點」的想法。再次感謝。
可能只是我而已,但我喜歡儘可能保守地使用if ... else。我注意到它使得代碼不易維護 – 2010-10-24 09:50:17
players.remove()將在集合被更改時返回true;不需要執行.contains()。 – KarlP 2010-10-24 10:12:49
@KarlP:我知道,但我認爲明確的檢查會使邏輯更加清晰。 – Grodriguez 2010-10-24 10:26:52