我的文档类应该具有打印方法还是应该有专用的打印机类?

时间:2018-09-05 15:28:33

标签: c# oop architecture

我想编写一个打印文档的应用程序。

哪种设计会更好?变体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的使用会更直观。

3 个答案:

答案 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
    }
}