【问题标题】:Design suggestion for an invoice application发票应用程序的设计建议
【发布时间】:2014-05-28 13:23:59
【问题描述】:

我正在尝试为我们公司制作发票管理系统。由于设计原则,我有点困惑。固体

假设一个类负责处理发票:InvoiceProcessor

InvoiceProcessor ip=new InvoiceProcessor(DraftHTML);
ip.Customer=theCustomer;
ip.Order=theOrder;
ip.Prepare();

在此之后,哪种方法更好?为什么?

一)

ip.SaveToFile(fileName);
ip.SendToCustomer();

ip.DBConnection=myActiveConnection;
ip.LoadFromDB(invoiceID);
ip.SaveToDB();

B)

SaveToFile(fileName,ip.GetHTML());
SendEmail(ip.Customer,ip.GetHTML());

ip.InvoiceInfo=LoadFromDB(invoiceID);
SaveToDB(ip.InvoiceInfo);

【问题讨论】:

  • 对我来说——InvoiceProcessor 域处理与处理发票相关的事情更有意义。因此,选项 B 最有意义。
  • 我看到很多职责(准备/创建发票、加载、保存、发送电子邮件)而且只有一个类 - 这已经破坏了 SOLID。

标签: c# oop design-principles


【解决方案1】:

恕我直言,A) 和 B) 都违反了 SRP 原则,尽管 B) 耦合度较低。

我会用另一种方式来解决这个问题:

  1. 创建一个代表Invoice的新类型
  2. 使InvoiceProcessor 返回Invoice 的实例
  3. 为每个后处理步骤创建不同类型的操作。

代码应如下所示:

var ip = new InvoiceProcessor
{
    Customer = theCustomer,
    Order = theOrder
};
var invoice = ip.CreateInvoice();
// Post processing
HtmlPrinter.PrintInvoice(invoice, htmlFileName);
DataAccess.SaveInvoice(invoice);
MailService.SendInvoiceToCustomer(invoice, theCustomer.Email);

【讨论】:

    【解决方案2】:

    B 选项更好,因为您可以以多种方式使用您的方法。如果您选择第一个建议,那么将来如果您想为您的调度编写代码,那么您必须再次为调度部分编写相同的代码。这将导致您的代码中出现错误的模式。您应该尽可能避免重复代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 2011-02-01
      相关资源
      最近更新 更多