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