聚合不同责任的最佳方式

时间:2011-02-11 14:12:18

标签: c# design-patterns

我有一个应用程序,它读取条形码,提取零件并检查它是否有效。 我使用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);
   }
}

5 个答案:

答案 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课程更容易测试,这通常表明您正在做正确的事情。 (你必须减少一个方法。)

如果您的消费类只对解析的条形码感兴趣,那么这是一种更好的方法。