这段代码是循环依赖的一个例子吗?
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);
}
我知道这个例子是错误的编程,但是由于值方法,接口是否禁止循环依赖?
答案 0 :(得分:6)
我认为在类图中更容易看到。如您所见,Sheet
具体类和Expr
接口之间确实存在循环依赖关系。我不会说它是非常坏因为我认为2个具体类之间的循环依赖性是最差的...那么说,如果可能的话,这样做肯定是不可取的。
您的代码
因此,也许您可能考虑重构的方法之一就是让AddressExpr
依靠SuperSheet
代替Sheet
和Expr
来依赖{{1}而不是SuperSheet
: -
Sheet
...这将删除任何不需要的循环依赖。
可能的重构代码
注意:我并不是说这是解决方案。我只是说你当然可以看看重构代码的方法,以最小化或删除循环依赖,因为循环依赖会使你的代码难以进行单元测试。对接口进行编码总是有助于消除不需要的循环依赖。它还使您的代码更容易进行单元测试,因为您可以轻松地模拟对象。
答案 1 :(得分:3)
这是一个非常时髦的例子。我对这里的思考过程非常冗长,因为我怀疑有一些愚蠢的命名。
包裹: 片 EXPR
表格内容:
expr的内容:
每个用法:
我们看到AddressExpr依赖于Sheet,它位于工作表包中。一个依赖关系。
我们还看到Sheet取决于expr包中的Address。
因此,工作表和expr包之间存在循环依赖关系。 (注意:工具可以显示这一点。我手工完成,因为你的问题非常抽象。查看JDepend)
另外,我甚至不确定我是否听说过价值方法。如果编译器可以理解双向接口的使用,那么它将起作用。它有解开混乱的感觉。
答案 2 :(得分:2)
至少在包级别上。包sheet
取决于包expr
,反之亦然。根据自己的经验 - 我会重构这个。