我正在用PHP编写一个带有域模型的应用程序,我想知道我应该采用哪种命名约定。
假设我有Customer
,其聚合根目录中有Address
。
我也有一个Product
,其聚合根目录中有Option
。
我有两种选择:
将聚合根保持在域模型的根目录:
Customer
Customer\Address
Product
Product\Option
专家:我可以在同一名称空间中同时使用Customer
和Product
Con :Customer
必须引用自己的Address
作为Customer\Address
将所有聚合类分组到同一名称空间中,包括聚合根目录:
Customer\Customer
Customer\Address
Product\Product
Product\Option
专家:Customer
可以将其地址引用为Address
Con :从我的根域名称空间,我必须参考:
Customer
为Customer\Customer
Product
为Product\Product
答案 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也使用此约定