2013-06-02 31 views
1

我正在實施類似於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)); 
    } 
} 

我開始用的aproach下1),但我現在有一種懷疑,因爲我總是需要在測試中存根依賴,以便實現某種程度上似乎對我而言不正確的實現。 另外我在這裏看不到任何優勢,因爲我可以完全測試AND,OR,NOT和XOR與真值表的實現。

我應該選擇哪種方式?

回答

3

想想你如何使用實際的邏輯門。

通常你有兩個輸入,一個輸出和一個黑盒子。無論是NAND,AND,OR還是其他 - 無關緊要,界面看起來完全相同。所有的邏輯門看起來都一樣。如果你有一個採用不同邏輯門的電路,你可以將它們中的任何一個插入它並獲得不同的行爲。

因此,您的界面命名是問題的一部分。這不是具有實現的NAND或AND,而是可以作爲NAND或AND實現的LogicGate。

如果你這樣做,它也變得很明顯,AND門不能只依靠傳遞給它的任何東西的實現。它需要或者真正的NAND門,或者使其工作的其他方式。

當使用合作者的東西可以完全信任他們並且不需要知道他們的實現時,DI是合適的。情況並非如此 - 也可能有其他方法讓AND門工作 - 所以不要使用DI。

如果有什麼事,它使用一個邏輯門,而無需關心其實現 - 只要相信,它正在做相應的工作,不管它正好是在時間 - 然後你可以使用DI。