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方法,接口是否禁止循环依赖?
我认为在类图中更容易看到.如您所见,Sheet具体类和Expr接口之间确实存在循环依赖关系.我不会说它非常糟糕,因为我认为2个具体类之间的循环依赖性是最差的...那么说,如果可能的话,这样做肯定是不可取的.
你的守则

因此,也许你可以考虑重构的方法之一是让你AddressExpr依靠SuperSheet,而不是Sheet和Expr依赖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)
...这将删除任何不需要的循环依赖项.
可能的重构代码

注意:我并不是说这是解决方案.我只是说你当然可以看看重构代码的方法,以最小化或删除循环依赖,因为循环依赖会使你的代码难以进行单元测试.对接口进行编码总是有助于消除不需要的循环依赖.它还使您的代码更容易进行单元测试,因为您可以轻松地模拟对象.
这是一个非常有趣的例子。我将在这里详细介绍我的思考过程,因为我怀疑其中存在一些愚蠢的命名。
包装:表 expr
片材内容:
expr 的内容:
每个中的用法:
我们看到AddressExpr依赖于Sheet,而Sheet位于sheet包中。一种依赖性下降。
我们还看到 Sheet 依赖于 expr 包中的 Address。
因此,sheet 包和 expr 包之间存在循环依赖关系。(注意:工具可以显示这一点。我手工完成的,因为你的问题非常抽象。查看 JDepend)
另外,我什至不确定我是否听说过价值方法。如果编译器可以理解双向接口的使用,它就会起作用。它有理清混乱的意义。
| 归档时间: |
|
| 查看次数: |
1845 次 |
| 最近记录: |