首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当类可以通过黑盒测试进行测试时,我应该避免Di吗

当类可以通过黑盒测试进行测试时,我应该避免Di吗
EN

Stack Overflow用户
提问于 2013-06-02 19:00:36
回答 1查看 90关注 0票数 1

我正在实现一些类似于nand2tetris项目的东西,除了我所有的代码都是用java编写的,而不是HDL,而且我是自己写测试的。为了说明问题:我已经实现了nand逻辑门,它将依赖于OR,AND,XOR和NOT逻辑门。

我对这两种方法持怀疑态度:

1) DI方法

代码语言:javascript
运行
复制
public interface Nand {
  int nand(int a, int b);
}

public class NandImpl implements Nand {
  public int nand(int a, int b) {
    return a * b == 0 ? 1 : 0;
  }
}

public interface And {
  int and(int a, int b);
}

public class AndImpl implements And {
  Nand nand;

  public AndImpl(Nand nand) {
    this.nand = nand;
  }

  public int and(int a, int b) {
    return nand.nand(nand.nand(a, b), nand.nand(a, b));
  }
}

2)无依赖注入的方法

代码语言:javascript
运行
复制
public class NandImpl {

  static NandImpl singleton = null;

  protected NandImpl() {
  }

  public static NandImpl getInstance() {
    if(singleton == null) {
      singleton = new NandImpl();
    }
    return singleton;
  }

  public int nand(int a, int b) {
    return a * b == 0 ? 1 : 0;
  }
}

public class AndImpl {

  static AndImpl singleton = null;
  NandImpl nand;

  protected AndImpl() {
    nand = NandImpl.getInstance();
  }

  public static AndImpl getInstance() {
    if(singleton == null) {
      singleton = new AndImpl();
    }
    return singleton;
  }

  public int and(int a, int b) {
    return nand.nand(nand.nand(a, b), nand.nand(a, b));
  }
}

我从1)以下的方法开始,但现在我有疑问,因为我总是需要在测试中存根依赖才能有真正的实现,这在我看来似乎是错误的。另外,我在这里看不到DI的任何优势,因为我可以使用真值表完全测试AND、OR、NOT和XOR实现。

我应该选择哪种方式?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-02 19:55:29

考虑一下如何使用实际的逻辑门。

通常有两个输入,一个输出,中间有一个黑盒。不管它是NAND、AND、OR还是其他任何东西-接口看起来都是一样的。所有逻辑门看起来都是一样的。如果你有一个采用不同逻辑门的电路,你可以将它们中的任何一个插入其中,并获得不同的行为。

因此,您的接口命名是问题的一部分。这不是NAND或AND实现,它是一个LogicGate,可以实现为NAND或AND。

如果您这样做了,那么很明显,AND门不能仅仅依赖于传递给它的任何东西的实现。它要么需要实际的NAND门,要么需要其他使其工作的方式。

当使用其合作者的事物可以完全信任它们,并且不需要知道它们的实现时,DI是合适的。这里的情况并非如此-而且可能还有其他方法可以让and门工作-所以不要使用DI。

如果有任何东西使用逻辑门,而不关心它的实现-只要相信它正在做适当的工作,无论它当时发生了什么-那么你可以使用DI。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16882110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档