c# - 发票应用程序的设计建议

标签 c# oop design-principles

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

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

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

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

A)

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);

最佳答案

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

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

  1. 创建一个代表发票的新类型
  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);

关于c# - 发票应用程序的设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23912871/

相关文章:

c# - 通过工厂创建实例时隔离实例的依赖关系(以及该实例的依赖关系)

c# - DateTimeOffset 格式并获得与 moment.js 相同的输出

c# - UML帮助C#设计原则

javascript - 从 subview 模型修改在父级上可观察到的 knockout 的模式

c# - 从 Active Directory 获取所有直接报告

c# - 没有 equals 方法 WCF 的代理类

C++ 组合最佳实践

php - Laravel:从 Blade 模板调用 Controller 类的方法

c++ - 我认为我的析构函数导致错误发生。你能帮我弄清楚为什么吗?

java - 控制反转与好莱坞原则的混淆