这是循环依赖吗?

时间:2011-02-14 13:44:20

标签: 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);
}

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

3 个答案:

答案 0 :(得分:6)

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

您的代码

enter image description here

因此,也许您可​​能考虑重构的方法之一就是让AddressExpr依靠SuperSheet代替SheetExpr来依赖{{1}而不是SuperSheet: -

Sheet

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

可能的重构代码

enter image description here

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

答案 1 :(得分:3)

这是一个非常时髦的例子。我对这里的思考过程非常冗长,因为我怀疑有一些愚蠢的命名。

包裹: 片 EXPR

表格内容:

  • SuperSheet

expr的内容:

  • AddressExpr
  • Expr的
  • 地址

每个用法:

  • AddressExpr - Expr,Address,Sheet
  • Sheet - SuperSheet,地址

我们看到AddressExpr依赖于Sheet,它位于工作表包中。一个依赖关系。

我们还看到Sheet取决于expr包中的Address。

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

另外,我甚至不确定我是否听说过价值方法。如果编译器可以理解双向接口的使用,那么它将起作用。它有解开混乱的感觉。

答案 2 :(得分:2)

至少在包级别上。包sheet取决于包expr,反之亦然。根据自己的经验 - 我会重构这个。