DDD:域模型命名空间约定



我正在用PHP编写一个带有域模型的应用程序,我想知道我应该采用哪种命名约定。

假设我有一个Customer,在它的聚合根内有一个Address
我也有一个Product,在它的聚合根内有一个Option

我有两个选择:

  1. 将聚合根保留在域模型的根:

    Customer
    CustomerAddress
    Product
    ProductOption
    

    Pro:我可以在同一个命名空间中同时使用CustomerProduct
    Con: Customer必须引用自己的Address作为CustomerAddress

  2. 在同一个命名空间中将所有聚合类分组,包括聚合根:

    CustomerCustomer
    CustomerAddress
    ProductProduct
    ProductOption
    

    Pro: Customer可以引用其地址为Address
    Con:从我的根域命名空间,我必须引用:

    • Customer as CustomerCustomer
    • Product as ProductProduct

我之前写了一个小框架,我选择使用你提出的第一个解决方案。

将聚合根保留在域模型的根:

为什么?

实际上我也问过自己你今天问的问题,在和我的团队成员讨论了一下之后,我们一致认为在命名空间中不重复类名更合乎逻辑。


让我们看看如何用解n°2实例化你的类

CustomerCustomer
CustomerAddress

你必须写:

$customer = new CustomerCustomer();
$address = new CustomerAddress();

你可以看到重复,对吗?我感觉不太对劲。在我看来,这就像写

$customer->getCustomerId();

为什么在方法名中重复Customer ?我们知道它是客户的id,因为我们使用了一个customer对象。

这个模型的另一个"不好的事情"是不能使用保留关键字作为类名。

例如,使用pear约定,您可以使用

Customer_Abstract

位于Customer/abstract。php中这对我来说没问题但如果你试图用命名空间来翻译它你就会得到

namespace Customer;
class Abstract {}

导致致命错误。所以你需要在类名中重复域名:

namespace Customer;
class AbstractCustomer {}
$customer = new CustomerAbstractCustomer();

现在让我们看看如何用解n°1实例化你的类

Customer
CustomerAddress

你将写:

$customer = new Customer();
$address = new CustomerAddress();

我们不再需要重复两次Customer来实例化Customer类。然而,很明显Address与Customer有关。

这就是我选择使用这个模型的原因。

编辑:Zend框架2也使用这个约定

最新更新