2011-02-11 19 views
3

我有一個應用程序讀取條形碼,提取零件並檢查它是否有效。 我使用C#,Autofac和NUnit,我還在猶豫哪個是最好的實現:聚合不同責任的最佳方式

解決方案A:(?門面模式)

public class Checker { 
    public Checker(IBarcodeReader reader, IBarcodeParser parser) { 
     ... 
    } 
    public bool Check() { 
    string barcode = reader.Read(); 
    string id = parser.Parse(barcode); 
    // check if id is valid 

    } 
} 

溶液B: (策略模式?)

public class Checker { 
    public Checker(IBarcodeReader reader) { 
     ... 
    } 
    public bool Check() { 
    string id = reader.Read(); 
    // check if id is valid 

    } 
} 

public class BarcodeReader: IBarcodeReader { 
    public BarcodeReader(IBarcodeParser parser) { 
     ... 
    } 
    public string Read() { 
    string barcode = ... // read barcode from device 
    return parser.Parse(barcode); 
    } 
} 
+0

在第二天,你給條形碼閱讀器一個條形碼解析器實例,然後使用 - 這不是戰略模式的特徵,對吧? – 2011-02-11 14:18:34

回答

0

你不是在過度工作嗎?至少從這個例子看起來就是這樣。 我會放棄策略模式的想法。你會有多一個策略?

我喜歡第一個解決方案(良好的可測試性和DI),但我不會將3行代碼稱爲Facade,真的。

0

我更喜歡解決方案A,因爲在我看來,它更好地分離關係納秒。 BarcodeReader讀取條形碼並將其作爲字符串返回(這是條形碼所代表的內容)。

0

假設沒有關於您的應用程序的其他內容,請使用解決方案A.它使事物儘可能簡潔和可維護,直到您顯示解決方案B的複雜性增加的需求。第三個選項是甚至不使用構造函數,但要有執行檢查的靜態函數。

此外,我會重新命名你的功能。他們返回值,但他們的名字不反映。你想用IsValid()代替Check()和GetBarcode()代替Read()。

0

我會選擇你的解決方案B.雖然它不一定看起來像我喜歡的戰略模式,因爲它有更好的分離關注點。 BarcodeReader是通用的,它只知道如何閱讀條形碼的一部分並將其發回。它可以用於任何讀取條形碼的應用程序。 Checker看起來更具商業特色。您的第一個解決方案是將商業邏輯和條形碼的通用閱讀混合在一起。 (注意:我假設驗證邏輯是商業邏輯,而不是條形碼特定的驗證,如果是條形碼特定驗證,則應該在條形碼讀取器中進行驗證。)

我會在XmlReader之後對讀取器進行建模。它會檢查格式良好的XML等。

0

解決方案B使您的Checker類更容易測試,這通常表明您正在做正確的事情。 (您必須存根少一個方法。)

如果您的消費類只對解析的條形碼感興趣,那是一個更好的方法。