DDD:域模型命名空间约定

时间:2011-08-09 19:42:44

标签: php namespaces domain-driven-design naming-conventions namespace-organisation

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

假设我有Customer,其聚合根目录中有Address
我也有一个Product,其聚合根目录中有Option

我有两种选择:

  1. 将聚合根保持在域模型的根目录:

    Customer
    Customer\Address
    Product
    Product\Option
    

    专家:我可以在同一名称空间中同时使用CustomerProduct
    Con Customer必须引用自己的Address作为Customer\Address

  2. 将所有聚合类分组到同一名称空间中,包括聚合根目录:

    Customer\Customer
    Customer\Address
    Product\Product
    Product\Option
    

    专家Customer可以将其地址引用为Address
    Con :从我的根域名称空间,我必须参考:

    • CustomerCustomer\Customer
    • ProductProduct\Product

1 个答案:

答案 0 :(得分:5)

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

  

将聚合根保持在域模型的根目录:

为什么呢?

实际上我问自己今天要问的同一个问题,经过与我的队友的一些讨论后,我们同意不重复命名空间中的类名更合乎逻辑。


让我们看看如何使用解决方案n°2实现您的课程

Customer\Customer
Customer\Address

你必须写:

$customer = new Customer\Customer();
$address = new Customer\Address();

你可以看到重复吗?对我来说这种感觉并不合适。 在我看来,这就像写作

$customer->getCustomerId();

为什么在方法名称中重复客户?我们知道这是客户的ID,因为我们正在使用Customer对象。

使用此模型的另一个“坏事”是不可能将保留关键字用作类名。

例如,使用pear约定你可以拥有类

Customer_Abstract

位于Customer / Abstract.php,这对我没问题,但是如果你尝试使用命名空间翻译它,你将有

namespace Customer;

class Abstract {}

导致致命错误。因此,您将不得不在类名中重复该域:

namespace Customer;

class AbstractCustomer {}

$customer = new Customer\AbstractCustomer();

现在让我们看看如何使用解决方案n°1实现您的课程

Customer
Customer\Address

你会写:

$customer = new Customer();
$address = new Customer\Address();

我们不必再重复客户两次以实现Customer类。但是,地址仍然与客户有关。

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

编辑:Zend Framework 2也使用此约定