DDD: Соглашение о пространствах имен модели домена - PullRequest
10 голосов
/ 09 августа 2011

Я пишу приложение с моделью предметной области на PHP, и мне интересно, какое соглашение об именах мне следует принять.

Скажем, у меня есть Customer, с Address в его агрегированном корне,У меня также есть Product, имеющий Option в своем агрегированном корне.

У меня есть две альтернативы:

  1. Сохранение агрегированных корней в корне доменамодель:

    Customer
    Customer\Address
    Product
    Product\Option
    

    Pro : я могу использовать Customer и Product в одном пространстве имен Con : Customer должен ссылаться на свой Address как Customer\Address

  2. Группировать все агрегатные классы в одном пространстве имен, , включая Совокупный корень:

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

    Pro : Customer может ссылаться на свой адрес как Address Con : из моего пространства имен корневого домена я должен ссылаться:

    • Customer как Customer\Customer
    • Product как Product\Product

1 Ответ

5 голосов
/ 29 августа 2011

Некоторое время назад я написал небольшую структуру, и я решил использовать первое предложенное вами решение.

Хранить совокупные корни в корне модели домена:

Почему?

На самом деле я задал себе тот же вопрос, который вы задаете сегодня, и после небольшого разговора с моими товарищами по команде мы согласились, что было бы логичнее не повторять имя класса в пространстве имен.


Давайте посмотрим, как реализовать ваши классы с помощью решения n ° 2

Customer\Customer
Customer\Address

Вам нужно будет написать:

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

Вы можете видеть повторение, верно? Это как-то не похоже на меня. На мой взгляд, это все равно что писать

$customer->getCustomerId();

Зачем повторять Customer в названии метода? Мы знаем, что это идентификатор клиента, так как мы используем объект Customer.

Еще одна «плохая вещь» этой модели - невозможность использовать зарезервированное ключевое слово в качестве имени класса.

Например, используя соглашение о груше, вы могли бы иметь класс

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. Однако все еще ясно, что Адрес связан с Заказчиком.

Вот почему я решил использовать эту модель.

РЕДАКТИРОВАТЬ: Zend Framework 2 использовать это соглашение тоже

...