我想要实现的功能是从数据库中检索一些数据,并根据一些参数从数据中创建一个文本文件。我创建了一个FileProcessor类来执行此操作。
public class FileGenerator
{
public FileGenerator(IDataProvider dataProvider)
{
// some constructor logic
}
public void Generate(string fileType)
{
var data = dataProvider.getData()
Logger.LogMessage("Retrieved data");
var file = FileFactory.GetFileInstance(fileType).CreateFile()
Logger.LogMessage("File Created");
}
}
在上面的代码片段中,构造函数从客户端获取dataProvider。 FileFactory创建一个文件类型的实例,实例中的Create方法实际生成一个文件。 Logger组件处理所有日志记录机制,并且可以配置是否写入磁盘或数据库等。
此类FileGenerator是否违反了SRP?
答案 0 :(得分:0)
我个人会通过使用generate(String fileType,Data data)将DataProvider与FileGenerator完全脱离,其中数据是一个单独的占位符类,因此如果您选择,可以为它添加好的函数,比如toLowerCase()或toString ()或你能想到的任何东西。
相反,您拥有一个管理类,可以调用DataProvider,获取数据,将其放入一个可以使用的类中,然后将其传递给FileGenerator。如果DataProvider不是必须的话,它应该不知道DataProvider。假设您创建了一个DifferentDataProvider。您将如何重用FileGenerator。你不能。您必须编写DifferentFileGenerator,以便它可以调用新数据提供程序上的特定方法,而FileGenerator不知道这些方法,因为它获取了DataProvider。它不是一种灵活且可维护的设计。
对于日志记录,也可以由管理器处理,该管理器在成功的方法返回上记录事件。这样,当您将FileGenerator换成其他类型的FileGenerator时,您不必重写所有日志消息。
我还使用枚举来生成您的文件生成器可以生成的文件类型。它的维护起来要容易得多,而且可以更清楚地生成哪些文件。
我希望这会有所帮助,如果没有,请务必要求澄清。我强烈建议您阅读Head First Design Patterns以获得许多常见编程问题的标准解决方案。