OO-Design und zirkuläre AbhängigkeitenJava

Java-Forum
Guest
 OO-Design und zirkuläre Abhängigkeiten

Post by Guest »

Ich kämpfe derzeit mit einem zirkulären Abhängigkeitsproblem beim Entwerfen meiner Klassen.

Seitdem ich vom Anemic Domain Model gelesen habe (etwas, das ich die ganze Zeit gemacht habe), habe ich wirklich versucht, davon wegzukommen, Domänenobjekte zu erstellen, die nur „ Eimer voller Getter und Setter“ und kehre zu meinen OO-Wurzeln zurück.

Das folgende Problem ist jedoch eines, auf das ich häufig stoße, und ich bin mir nicht sicher, wie ich es anstellen soll Löse es.

Angenommen, wir haben eine Team-Klasse, die viele Spieler hat. Es spielt keine Rolle, um welche Sportart es sich handelt :) Ein Team kann Spieler hinzufügen und entfernen, genauso wie ein Spieler ein Team verlassen und einem anderen beitreten kann.

Also Wir haben das Team, das eine Liste von Spielern hat:

Code: Select all

public class Team {

private List
 players;

// snip.

public void removePlayer(Player player) {
players.remove(player);
// Do other admin work when a player leaves
}
}
Dann haben wir den Player, der einen Verweis auf das Team hat:

Code: Select all

public class Player {
private Team team;

public void leaveTeam() {
team = null;
// Do some more player stuff...
}
}
Man kann davon ausgehen, dass beide Methoden (Entfernen und Verlassen) über eine domänenspezifische Logik verfügen, die immer dann ausgeführt werden muss, wenn ein Team einen Spieler entfernt und ein Spieler ein Team verlässt. Daher ist mein erster Gedanke, dass, wenn ein Team einen Spieler kickt, „removePlayer(...)“ auch die Methode „player.leaveTeam()“ aufrufen sollte...

Was aber, wenn der Spieler den Abgang vorantreibt – sollte die Methode „leaveTeam()“ team.removePlayer(this) aufrufen? Nicht ohne eine Endlosschleife zu erstellen!

In der Vergangenheit hätte ich diese Objekte einfach zu „dummen“ POJOs gemacht und eine Serviceschicht gehabt Mach die Arbeit. Aber selbst jetzt bleibt mir immer noch dieses Problem: Um zirkuläre Abhängigkeiten zu vermeiden, muss die Serviceschicht immer noch alles miteinander verknüpfen – d. h.

Code: Select all

public class SomeService {

public void leave(Player player, Team team) {

team.removePlayer(player);
player.leaveTeam();

}

}
Mache ich das zu kompliziert? Vielleicht übersehe ich einen offensichtlichen Designfehler. Über jedes Feedback würden wir uns sehr freuen.



Vielen Dank an alle für die Antworten. Ich akzeptiere die Lösung von Grodriguez, da sie die offensichtlichste (ich kann nicht glauben, dass sie mir nicht in den Sinn gekommen ist) und einfach zu implementieren ist. DecaniBass bringt jedoch einen guten Punkt auf den Punkt. In der von mir beschriebenen Situation ist es möglich, dass ein Spieler ein Team verlässt (und sich darüber im Klaren ist, ob er einem Team angehört oder nicht), ebenso wie das Team, das den Abgang vorantreibt. Aber ich stimme Ihrem Standpunkt zu und mir gefällt die Vorstellung nicht, dass es in diesem Prozess zwei „Einstiegspunkte“ gibt. Nochmals vielen Dank.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post