Projeto OO e dependências circulares
Atualmente, estou enfrentando um problema de dependência circular ao projetar minhas classes.
Desde que li sobre oModelo de domínio anêmico (algo que eu fazia o tempo todo), eu realmente estava tentando evitar criar objetos de domínio que eram apenas "baldes de getters e setters" e retornar às minhas raízes OO.
No entanto, o problema abaixo é um que me deparo bastante e não tenho certeza de como devo resolvê-lo.
Digamos que temos umEquipe classe, que tem muitosJogadoras. Não importa que esporte seja esse :) Um time pode adicionar e remover jogadores, da mesma maneira que um jogador pode deixar um time e se juntar a outro.
Então, temos a equipe, que tem uma lista de jogadores:
public class Team {
private List<Player> players;
// snip.
public void removePlayer(Player player) {
players.remove(player);
// Do other admin work when a player leaves
}
}
Depois, temos o jogador, que tem uma referência à equipe:
public class Player {
private Team team;
public void leaveTeam() {
team = null;
// Do some more player stuff...
}
}
Pode-se supor que ambos os métodos (remover e sair) têm uma lógica específica do domínio que precisa ser executada sempre que um time remove um jogador e um jogador sai de um time. Portanto, meu primeiro pensamento é que quando umEquipe chute um jogador, removePlayer (...) também deve chamar o método player.leaveTeam () ...
Mas e se oJogador está conduzindo a partida - o método leaveTeam () deve chamar team.removePlayer (this)? Não sem criar um loop infinito!
No passado, Eu teria acabado de tornar esses objetos "burros" POJOs e teria uma camada de serviço para fazer o trabalho. Mas mesmo agora ainda me resta esse problema: para evitar dependências circulares, a camada de serviço ainda vincula tudo - ou seja,
public class SomeService {
public void leave(Player player, Team team) {
team.removePlayer(player);
player.leaveTeam();
}
}
Estou mais complicando isso? Talvez eu esteja perdendo alguma falha de design óbvia. Qualquer comentário seria muito apreciado.
Obrigado a todos pelas respostas. Estou aceitandoGrodriguezA solução, pois é a mais óbvia (não posso acreditar que isso não tenha me ocorrido) e fácil de implementar. Contudo,DecaniBass faz um bom argumento. Na situação que descrevi, é possível que um jogador saia de um time (e saiba se ele está em um time ou não), assim como o time que está conduzindo a remoção. Mas eu concordo com o seu ponto de vista e não gosto da ideia de que haja dois "pontos de entrada" nesse processo. Obrigado novamente.