Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 哪门课做得更好';关注点分离';_Oop_Solid Principles - Fatal编程技术网

Oop 哪门课做得更好';关注点分离';

Oop 哪门课做得更好';关注点分离';,oop,solid-principles,Oop,Solid Principles,我有一个类,它创建一个文档并保存它: public class DocCreator { private IDocumentStore _documentStore; public DocCreator(IDocumentStore documentStore) { _documentStore = documentStore; } public void CreateAndSave() { var doc = new Document();

我有一个类,它创建一个文档并保存它:

public class DocCreator
{
  private IDocumentStore _documentStore;

  public DocCreator(IDocumentStore documentStore)
  {
    _documentStore = documentStore;
  }

  public void CreateAndSave()
  {
    var doc = new Document();
    doc.Title = "this is a title";
    doc.Content = whateverStream;
    doc.Hash = CalculateHash(doc.Content);
    //[do more things to create a doc]

    _documentStore.PersistToDisk(doc);
  }
}
我认为这很不错,因为保存东西的代码隐藏在
DocumentStore
中。但是我们可以更进一步,删除调用documentStore.PersistToDisk(doc)到另一个类,如下所示:

public class DocCreatorWorkflow
{
  private IDocumentStore _documentStore;

  public DocCreatorWorkflow(IDocumentStore documentStore)
  {
    _documentStore = documentStore;
  }

  public void CreateAndSave()
  {
    var docCreator = new DocCreator();
    var doc = docCreator.Create();

    _documentStore.PersistToDisk(doc);
  }
}
在上面的示例中,我创建了另一个类,它调用两个
较低的
类,因此负责“工作流”。它可能更干净,但也会使事情变得更复杂。不是吗


或者我应该一直选择第二个选项吗?

我会选择第二个选项。但是,您需要修改DocCreatorClass,因为它不再负责将其保存到磁盘:

public static class DocCreatorClass
{
    public static Document Create()
    {
        Document doc = new Document();
        // Property assignment code here.

        return doc;
    }
}
它将是静态的,因此您不需要实例化DocCreatorClass。我还将在DocCreatorWorkflow类中为创建和保存创建单独的函数:

public class DocCreatorWorkflow
{
    public IDocumentStore _documentStore;

    public DocCreateWorkflow(IDocumentStore documentStore)
    {
    }

    public void Document Create()
    {
        return DocCreatorClass.Create();
    }

    public void Save(Document doc)
    {
        _documentStore.PersistToDisk(doc);  
    }

    public void CreateAndSave()
    {
        Save(Create());
    }
}
这样,您不必总是立即将新创建的文档保存到磁盘。CreateAndSave()将是一个方便的函数,它可以在其中调用Save()和Create(),以防您的程序需要经常立即保存新文档

这种类型的设计无疑是更复杂的编码。从长远来看,它更容易查看和维护,因为每个函数只做一件事


我个人坚持(大多数时候,因为可能会有例外)一个班级,一个责任的规则。这样,当您注意到某个功能不起作用时,就可以更容易地找到项目的一部分。当您着手修复它时,您可以放心,应用程序的其余部分(其他任务,因此是类)没有被触及。对于函数,我喜欢以这样的方式创建它们:在一个类中,没有代码块会在两个或更多不同的地方重复。这样,您就不必查找所有相同的代码块进行更新。

根据可用信息,选项二看起来更好(尽管可能有其他信息会改变此判断)


但是,一般来说,你如何确定哪一个更好?我认为,最好首先从概念化关注点开始,而不涉及代码。例如,在这种情况下,我认为有三个问题。1) 创建文档2)持久化文档3)执行涉及创建和保存文档的逻辑(某些工作单元)。关键是,第三个问题与前两个问题是分开的。DocCreator和DocumentStore都不知道它们是以这种方式调用的,或者以其他方式调用的。因此,这与他们无关。

您可能希望在it上发布此问题,以便查看代码并建议改进和审阅。我认为您应该问自己的问题是:对于您的应用程序来说,您是否希望创建文档而不将其保存到存储中,这是一种现实的情况?如果是这样,那么您的第二种方法是更好的主意,因为您可以按原样重用代码。如果不是,那么您的第一种方法是有效的替代方法。