实践DDD,发票管理

现在有如果一个示例业务,是从真实业务中抽象出来的,大家考虑一下,用DDD的方法如果来设计 domain model 和service.

发票管理
发票 ,每一张发票有金额,日期,销售方,购货方等
争议 ,是对发票而言,每一个争议有:日期,原因,现在状态,争议的金额,争议的发票。

业务规则:
1. 一张或者多张发票可以引起一个争议。
2. 一个争议中的发票可以单独解决。如果这张发票是争议中的最后一张未解决的发票,则这个争议同时解决。
3. 如果一个争议解决,则所有与这个争议相关的发票全部成为没有争议的。
4. 当一张发票被支付以后,如果这张发票上有争议,则从相应的争议中把这张发票移去。如果这张发票是争议中的最后一张未解决的发票,则这个争议同时解决。
5. 所有针对争议原因的修改,都要记录其修改历史,并可以查看。


最简单的设计方法,也是最容易想到的如下:
public class Invoice {
Date invoiceDate;
double invoiceAmount ;
String Client;
String Debtor ;
boolean isDispute;
}

public class Dispute {
Date disputeDate ;
String reason ;
String narrative ;
ArrayList<Invoice> invoiceItems ;
ArrayList<DisputeHistory> history ;
Date resolveDate ;

public void ResolveDispute() {
}
public void changeNarrative(String narrative) {
}
}

public class DisputeHistory {
String narrative ;
}

public class disputeService {
public void payInvoice(Invoice invoice) {
}

public void resolveDispute(String DisputeId) {
}

public void changeDisputeNarrative(String narrative) {
}
}

这样的设计有什么问题吗?

这是一个根据不同条件设立对象关系的案例。

模型相对简单,条件逻辑判断多一些,可以使用ddd中的规格spec来实现,这个部分核心不应该在service中,而是Domain层。