11

我正在使用 PHP 中的域模型编写应用程序,并且想知道我应该采用哪种命名约定。

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

我有两种选择:

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

    Customer
    Customer\Address
    Product
    Product\Option
    

    Pro:我可以在同一个命名空间中同时 使用CustomerCon:必须引用它自己的Product
    CustomerAddressCustomer\Address

  2. 对同一命名空间中的所有聚合类进行分组,包括聚合根:

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

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

    • Customer作为Customer\Customer
    • Product作为Product\Product
4

1 回答 1

5

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

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

为什么?

实际上,我问了自己和你今天问的同样的问题,在与我的队友进行了一些讨论后,我们一致认为不在命名空间中重复类名感觉更合乎逻辑。


让我们看看如何使用解决方案 n°2 实例化您的类

Customer\Customer
Customer\Address

你必须写:

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

你能看到重复吗?这对我来说有点不对劲。在我看来,这就像写作

$customer->getCustomerId();

为什么要在方法名称中重复 Customer?我们知道这是客户的 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 两次来实例化 Customer 类。但是,仍然很清楚 Address 与 Customer 相关。

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

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

于 2011-08-29T13:09:20.353 回答