【发布时间】:2019-02-10 19:33:06
【问题描述】:
我想编写一个打印文档的应用程序。
哪种设计更好?变体 A:
class Document
{
public string Title { get; set; }
public string Author { get; set; }
public string Content { get; set; }
// ...
}
class DocumentPrinter
{
public void PrintDocument(Document document)
{
// ...
}
}
这将提供一个专用的 DocumentPrinter 类,它只进行打印。或者向 Document 类本身添加一个 Print() 方法会更好,就像这里(变体 B):
public class Document
{
public string Title { get; set; }
public string Author { get; set; }
public string Content { get; set; }
public void Print()
{
// ...
}
}
两种变体的隐含权衡是什么?哪一个在可维护性和架构方面更好?
我会说变体 A 更好,因为它会满足“ 单一责任原则”。但变体 B 使用起来会更直观。
【问题讨论】:
-
我会使用一个单独的类来匹配单一职责。想象一下,如果以后有理由将文档导出为 PDF,然后有另一个理由将其导出为 PNG 等......你什么时候会分解它?我会更进一步,让您的文档实现一个接口,并让您的 print/pdf/png 处理器接受该接口作为他们的输入。
-
从维护的角度来看,我认为第一种方式更好。随着打印机或文档的公共接口或实现细节发生变化,另一个不需要也发生变化。我也不同意变体 B 更直观。至少,我不希望该方法成为文档类的一部分。最后,如果您想获得哲理,文档不会自行打印。
-
@Dragonthoughts 为什么要为文档本身添加一个界面?我没有看到拥有更多变体的任何好处。它只是一个保存数据的对象。当然,DocumnetPrinter 类的情况正好相反(因为可以添加不同的输出格式)。
-
它分离了文档和打印机实现之间的任何直接依赖关系。
标签: c# oop architecture