我编写了许多涉及三个基本步骤的代码。
- 从某处获取数据。
- 转换数据。
- 将该数据放在某处。
我通常最终使用三种类型的类-受它们各自的设计模式的启发。
- 工厂-从某些资源构建对象。
- 调解员-要使用工厂,执行转换,然后使用指挥官。
- 指挥官-将数据放在其他地方。
我的班级往往很小,通常是一个(公共)方法,例如获取数据,转换数据,执行工作,保存数据。这导致类的激增,但总体上效果很好。
我在进行测试时遇到的困难是,我最终会紧密耦合测试。例如;
- 工厂-从磁盘读取文件。
- 指挥官-将文件写入磁盘。
没有其他人,我无法测试。我可以编写其他“测试”代码来进行磁盘读/写操作,但是随后我要重复一遍。
看看.Net,File类采用了不同的方法,它将(我的)工厂和指挥官的职责结合在一起。它具有“创建”,“删除”,“存在”和“全部读取”功能。
我是否应该遵循.Net的示例并将我的类结合在一起(尤其是在处理外部资源时)?它仍然耦合了代码,但是它更具故意性-它发生在原始实现中,而不是在测试中。
我在这里是否过于狂热地应用了“单一责任原则”?我有负责读和写的单独的类。当我可以拥有一个负责处理特定资源(例如系统磁盘)的组合类时。
Looking at .Net, the File class takes a different approach, it combines the responsibilities (of my) factory and commander together. It has functions for Create, Delete, Exists, and Read all in one place.
-请注意,您要将“责任”与“要做的事情”混为一谈。责任更像是“关注的领域”。File类的职责是执行文件操作。
File
C#在您的库中的重要一点是,就我们所知,File
该类可能只是一个外观,将所有文件操作放在一个位置-该类中,但是可以在内部使用与您的类类似的读/写类。实际上包含用于文件处理的更复杂的逻辑。这样的类File
仍将遵循SRP,因为实际使用文件系统的过程将在另一层之后抽象-最有可能使用统一接口。没有说是这样,但是可能是这样。:)