11

PHP でドメイン モデルを使用してアプリケーションを作成していますが、どの命名規則を採用すべきか迷っています。

Customerがあり、Addressその集約ルート内 に があるとしましょう。
また、集約ルート内Productに を持っています。Option

私には2つの選択肢があります:

  1. 集約ルートをドメイン モデルのルートに保持します。

    Customer
    Customer\Address
    Product
    Product\Option
    

    長所:同じ名前空間で 両方を使用できCustomerます短所:独自のものを次のように参照する必要があります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 を繰り返すのはなぜですか? Customer オブジェクトを使用しているため、これが顧客の ID であることはわかっています。

このモデルのもう 1 つの「悪い点」は、予約済みのキーワードをクラス名として使用できないことです。

たとえば、梨の慣習を使用すると、クラスを持つことができます

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 を 2 回繰り返す必要はありません。ただし、Address が Customer に関連していることは明らかです。

そのため、このモデルを使用することにしました。

編集:Zend Framework 2もこの規則を使用します

于 2011-08-29T13:09:20.353 に答える