[英]Should I avoid Di when classes are testable with black box testing
我正在實現類似於nand2tetris項目的東西,除了我在java中編寫我的所有代碼而不使用HDL並且我自己編寫測試。 對於問題ilustration:我已經實現了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)沒有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)開始使用aproach但我現在有一個疑問,因為我總是需要在測試中存根依賴關系來實現我看來有點不對的實際實現。 此外,我在DI上看不到任何優勢,因為我可以使用真值表完全測試AND,OR,NOT和XOR實現。
我應該選擇哪種方式?
想想你如何使用實際的邏輯門。
您通常有兩個輸入,一個輸出和一個黑盒子。 無論是NAND,AND,OR還是其他任何東西都沒關系 - 界面看起來完全相同。 所有邏輯門看起來都一樣。 如果你的電路采用不同的邏輯門,你可以將它們中的任何一個插入其中並獲得不同的行為。
因此,您的界面命名是問題的一部分。 這不是具有實現的NAND或AND,它是LogicGate,可以實現為NAND或AND。
如果你這樣做,很明顯AND門不能僅僅依賴於傳遞給它的任何東西的實現。 它需要實際的與非門,或其它一些使其工作的方式。
當使用其合作者的東西完全信任它們並且不需要知道它們的實現時,DI是合適的。 這不是這種情況 - 並且可能有其他方法可以使AND門工作 - 所以不要使用DI。
如果有任何東西使用邏輯門而不關心其實現 - 只是相信它正在做適當的工作,無論當時發生什么 - 那么你可以使用DI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.