这是循环依赖吗?

qwe*_*ert 10 java oop circular-dependency

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

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方法,接口是否禁止循环依赖?

lim*_*imc 6

我认为在类图中更容易看到.如您所见,Sheet具体类和Expr接口之间确实存在循环依赖关系.我不会说它非常糟糕,因为我认为2个具体类之间的循环依赖性是最差的...那么说,如果可能的话,这样做肯定是不可取的.

你的守则

在此输入图像描述

因此,也许你可以考虑重构的方法之一是让你AddressExpr依靠SuperSheet,而不是SheetExpr依赖SuperSheet,而不是Sheet: -

public class AdressExpr implements Expr {
    private Address address;
    private SuperSheet  sheet;

    public double value(SuperSheet sheet) {
        return sheet.value(address);
    }
}

public interface Expr {
    public double value(SuperSheet sheet);
}

...
...
Run Code Online (Sandbox Code Playgroud)

...这将删除任何不需要的循环依赖项.

可能的重构代码

在此输入图像描述

注意:我并不是说这是解决方案.我只是说你当然可以看看重构代码的方法,以最小化或删除循环依赖,因为循环依赖会使你的代码难以进行单元测试.对接口进行编码总是有助于消除不需要的循环依赖.它还使您的代码更容易进行单元测试,因为您可以轻松地模拟对象.


Mik*_*ike 3

这是一个非常有趣的例子。我将在这里详细介绍我的思考过程,因为我怀疑其中存在一些愚蠢的命名。

包装:表 expr

片材内容:

  • 床单
  • 超级表

expr 的内容:

  • 地址表达式
  • 表达式
  • 地址

每个中的用法:

  • AddressExpr - 表达式、地址、工作表
  • 工作表 - SuperSheet、地址

我们看到AddressExpr依赖于Sheet,而Sheet位于sheet包中。一种依赖性下降。

我们还看到 Sheet 依赖于 expr 包中的 Address。

因此,sheet 包和 expr 包之间存在循环依赖关系。(注意:工具可以显示这一点。我手工完成的,因为你的问题非常抽象。查看 JDepend)

另外,我什至不确定我是否听说过价值方法。如果编译器可以理解双向接口的使用,它就会起作用。它有理清混乱的意义。