我正在实现类似于 nand2tetris 项目的东西,除了我用 java 编写所有代码而不使用 HDL 并且我自己编写测试。对于问题说明:我已经实现了与 OR、AND、XOR 和 NOT 逻辑门相关的 nand 逻辑门。
我对这两种方法有疑问:
1) 直接投资方法
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) 没有 DI 的方法
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 实现。
我应该选择哪种方式?