我正在实现一些类似于nand2tetris项目的东西,除了我所有的代码都是用java编写的,而不是HDL,而且我是自己写测试的。为了说明问题:我已经实现了nand逻辑门,它将依赖于OR,AND,XOR和NOT逻辑门。
我对这两种方法持怀疑态度:
1) DI方法
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)无依赖注入的方法
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实现。
我应该选择哪种方式?
发布于 2013-06-02 19:55:29
考虑一下如何使用实际的逻辑门。
通常有两个输入,一个输出,中间有一个黑盒。不管它是NAND、AND、OR还是其他任何东西-接口看起来都是一样的。所有逻辑门看起来都是一样的。如果你有一个采用不同逻辑门的电路,你可以将它们中的任何一个插入其中,并获得不同的行为。
因此,您的接口命名是问题的一部分。这不是NAND或AND实现,它是一个LogicGate,可以实现为NAND或AND。
如果您这样做了,那么很明显,AND门不能仅仅依赖于传递给它的任何东西的实现。它要么需要实际的NAND门,要么需要其他使其工作的方式。
当使用其合作者的事物可以完全信任它们,并且不需要知道它们的实现时,DI是合适的。这里的情况并非如此-而且可能还有其他方法可以让and门工作-所以不要使用DI。
如果有任何东西使用逻辑门,而不关心它的实现-只要相信它正在做适当的工作,无论它当时发生了什么-那么你可以使用DI。
https://stackoverflow.com/questions/16882110
复制相似问题