我有一个应用程序,它读取条形码,提取零件并检查它是否有效。 我使用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 :(得分:0)
我更喜欢解决方案更好,因为在我看来,它可以更好地分离问题。 BarcodeReader读取条形码并将其作为字符串返回(这是条形码所代表的)。
答案 1 :(得分:0)
假设您的应用程序没有任何其他内容,请使用解决方案A.它使事情尽可能简洁和可维护,直到您显示需要增加解决方案B的复杂性。第三个选项是甚至不使用构造函数,但有静态功能执行检查。
另外,我会重命名你的功能。它们返回值,但它们的名称并未反映出这一点。你想要使用像IsValid()而不是Check()和GetBarcode()而不是Read()。
答案 2 :(得分:0)
你不是有点过度工程吗?至少这是它从示例中看起来的样子。 我会放弃战略模式的想法。你会有更多的策略吗?
我喜欢第一个解决方案(良好的可测试性和DI),但我不会将3行代码称为Facade,真的。
答案 3 :(得分:0)
我会选择你的解决方案B.虽然它不一定看起来像我喜欢的策略模式,因为它有更好的关注点分离。 BarcodeReader是通用的,它只知道如何读取条形码的部分并将其发回。它可用于任何阅读条形码的应用程序。 Checker看起来更具针对性。您的第一个解决方案是将业务逻辑和条形码的通用读取混合在一起。 (注意:我假设验证的逻辑是业务逻辑而不是条形码特定验证。如果是条形码特定验证,那么它应该进入条形码阅读器。)
我会在XmlReader之后为读者建模。它将检查格式良好的xml等。
答案 4 :(得分:0)
解决方案B使您的Checker
课程更容易测试,这通常表明您正在做正确的事情。 (你必须减少一个方法。)
如果您的消费类只对解析的条形码感兴趣,那么这是一种更好的方法。