0

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

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);
  }
}

在上面的示例中,我创建了另一个类,它调用两个lower类,因此负责“工作流”。它可能更干净,但它也使事情变得更加复杂。不是吗?

还是我应该总是选择第二种选择?

4

2 回答 2

0

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

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

于 2012-12-01T17:29:51.230 回答
0

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

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

        return doc;
    }
}

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

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(),以防您的程序经常想要立即保存一个新文档。

这种类型的设计肯定是更多的编码,可能会遇到更复杂的情况。从长远来看,它更容易查看和维护,因为每个功能只做一件事。

我个人坚持(大多数时候,因为可能有例外)一班一责的规则。当您发现某个功能不起作用时,这使您更容易找到项目的一部分。当您修复它时,您可以放心,您的应用程序的其余部分(其他任务,因此类)不会受到影响。对于函数,我喜欢以这样的方式创建它们,即在一个类中,不会在两个或多个不同的地方重复代码块。这样,您就不必寻找所有相同的代码块来更新。

于 2012-12-01T13:42:15.593 回答