相关疑难解决方法(0)

170
推荐指数
8
解决办法
7万
查看次数

OO设计和循环依赖

在设计我的类时,我目前正在努力解决循环依赖问题.

自从我读到有关贫血领域模型(我一直在做的事情)以来,我一直在努力摆脱创建只是"吸气剂和孵化器"的域对象并回到我的OO根源.

但是,下面的问题是我经常遇到的问题,我不确定应该如何解决它.

假设我们有一个Team类,有很多玩家.这是什么运动并不重要:)球队可以添加和删除球员,就像球员离开球队并加入另一支球队一样.

所以我们有一个团队,其中有一个玩家列表:

public class Team {

    private List<Player> players;

    // snip.

    public void removePlayer(Player player) {
        players.remove(player);
        // Do other admin work when a player leaves
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们有了Player,它引用了Team:

public class Player {
    private Team team;

    public void leaveTeam() {
        team = null;
        // Do some more player stuff...
    }
}
Run Code Online (Sandbox Code Playgroud)

可以假设这两种方法(删除和离开)都具有特定于域的逻辑,只要团队移除玩家并且玩家离开团队就需要运行这些逻辑.因此,我首先想到的是当一个团队踢一个玩家时,removePlayer(...)也应该调用player.leaveTeam()方法......

但是如果玩家正在推动出发 - 如果leaveTeam()方法调用team.removePlayer(this)该怎么办?不是没有创造无限循环!

在过去,我刚刚将这些对象设为"哑"POJO,并让服务层完成工作.但即使是现在我仍然存在这个问题:为了避免循环依赖,服务层仍然将它们连接在一起 - 即

public class SomeService {

    public void leave(Player player, …
Run Code Online (Sandbox Code Playgroud)

java oop circular-dependency

19
推荐指数
2
解决办法
3438
查看次数

这是循环依赖吗?

这段代码是循环依赖的一个例子吗?

package expr;
import sheet.Sheet
public class AdressExpr implements Expr
{
    private Address address; 
    private Sheet sheet; 
    public double value(Sheet sheet)
    {
        return sheet.value(address);
    }
}
public interface Expr
{
    public double value(Sheet sheet);
}
public class Adress
{
    // omissions
}

package sheet; 
import expr.Address; 
import expr.Expr;

public class Sheet implements SuperSheet
{
    private Map <Address, Expr> map; 
    public double value(Address address)
    {
    return map.get(Address).value(this);
    }
}
public interface SuperSheet
{
    public double value(Address address);
}
Run Code Online (Sandbox Code Playgroud)

我知道这个例子是错误的编程,但是由于value方法,接口是否禁止循环依赖?

java oop circular-dependency

10
推荐指数
2
解决办法
1845
查看次数