我正在用PHP编写一个带有域模型的应用程序,我想知道我应该采用哪种命名约定。
假设我有一个Customer
,在它的聚合根内有一个Address
。
我也有一个Product
,在它的聚合根内有一个Option
。
我有两个选择:
-
将聚合根保留在域模型的根:
Customer CustomerAddress Product ProductOption
Pro:我可以在同一个命名空间中同时使用
Customer
和Product
Con:Customer
必须引用自己的Address
作为CustomerAddress
-
在同一个命名空间中将所有聚合类分组,包括聚合根:
CustomerCustomer CustomerAddress ProductProduct ProductOption
Pro:
Customer
可以引用其地址为Address
Con:从我的根域命名空间,我必须引用:-
Customer
asCustomerCustomer
-
Product
asProductProduct
-
我之前写了一个小框架,我选择使用你提出的第一个解决方案。
将聚合根保留在域模型的根:
为什么?
实际上我也问过自己你今天问的问题,在和我的团队成员讨论了一下之后,我们一致认为在命名空间中不重复类名更合乎逻辑。
让我们看看如何用解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也使用这个约定