我想编写一个打印文档的应用程序。
哪种设计会更好?变体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的使用会更直观。
答案 0 :(得分:3)
我认为,解决方案A更好,因为它遵循SOLID,并且更易于维护,扩展,...您的应用。
此外,我认为您应该基于接口(可能是IDocumentPrinter)实现DocumentPrinter。
interface IDocumentPrinter
{
void PrintDocument(Document document);
}
class DocumentPrinter: IDocumentPrinter
{
public void PrintDocument(Document document)
{
// ...
}
}
让我们想一想:如果将来您需要拥有许多打印机,那么使用解决方案A(包括IDocumentPrinter),您只需要实现基于IDocumentPrinter的新类(DocumentPrinterA,DocumentPrinterB等),就不需要了更改您当前的类(Document,DocumentPrinter),并且不会违反Open-Close原则。
答案 1 :(得分:0)
对此问题最常见的一般回答是给Document
一个格式化函数(可能在接口中定义),该函数接受字符串并将其参数替换为字符串,然后使用Printer
或{ {1}}类,该类应用给定格式,然后“打印”结果(是否意味着写入输出,将其发送到打印队列,保存PDF文件或通过电子邮件将请求发送给印刷公司)。
如果这听起来像是您可能希望在不久的将来做某事,那么那就去做。否则,您将不得不将DocumentPrinter
逻辑与Print
逻辑紧密结合起来,因此请选择最简单的一种。
答案 2 :(得分:0)
我将按照以下说明进行操作。您的Printer类不需要了解文档的内在特性,因为它可以获取要打印的最终输出。
interface IPrintable
{
string GetOutput();
}
class Document : IPrintable
{
...
public string GetOutput()
{
return ...; // final formatted representation
}
}
class Printer
{
public void Print(IPrintable printable)
{
var output = printable.GetOutput();
... // print it out
}
}