1

エンティティに Doctrine ORM を使用するアプリケーションがあります。オブジェクト指向の設計に従って、できるだけ多くのビジネス ロジックをエンティティにプッシュしようとしています。しかし、私は小さな問題に遭遇しました。一部のビジネス ロジックには、外部アプリケーション構成で定義されている変数が必要です (微調整が必​​要になる場合があるため)。オブジェクト指向の原則に違反することなく、これらをエンティティに取り込むにはどうすればよいですか? エンティティからグローバル構成に直接アクセスしたくありません。また、これらの変数をエンティティやデータベース内に保存したくありません。

モードの具体的な例を次に示します。私は Doctrine ORM で PHP を使用していますが、Hibernate (JAVA)、nHibernate (C#) などにも同じ種類の OO 原則が適用されます。

私のアプリケーションには製品とユーザーがあります。ユーザーにはさまざまな種類があります (実際の人間のユーザー、自動化されたロボットなど)。それらはすべて Product オブジェクトで作業する必要があります。すべてのユーザーは、単一のメソッドを持つ同じ UserInterface を共有します。

class UserInterface {
    function canProcess(Product $product);
}

製品とユーザーの間を仲介する ProcessService があります。その時点でそれを処理しても構わないと思っているユーザーが見つかるまで、製品に関連付けられているすべてのユーザーを反復処理します。

class ProcessService {

    // Process a product
    function process(Product $product) {
        foreach ($this->getUsers() as $user) {
            if ($user->canProcess($product)) {
                ...
            }
     }
}

問題は、一部のユーザー (私の場合はロボットの 1 つ) が、製品を処理できるかどうかを判断するために、外部構成変数を必要とすることです。

その値をエンティティとデータベースに保存したくありません (適切な場所ではありません)。また、ロボット エンティティ内からグローバル構成オブジェクトにアクセスしたくありません (オブジェクト指向に違反しています)。canProcess()しかし、この変数はその 1 つのタイプのロボットにのみ適用され、システム内の他のすべての種類のユーザーには適用されないため、インターフェイス メソッドを介して渡すこともできません。したがって、UserInterface にも場所がありません。

では、この構成変数をエンティティに取り込むにはどうすればよいでしょうか?

4

2 に答える 2

1

まあ、私は3つの選択肢しか見ていません:

  1. 値を使用してロボット エンティティが作成されます
  2. 値は、ある時点でロボット エンティティに渡されます。
  3. ロボット エンティティは、おそらくある種のファクトリまたはシングルトンから値を取得します。

オプション3が最善の方法だと思います。

于 2012-05-15T14:34:08.023 に答える
0

postLoadイベントハンドラーを使用して解決しました。アプリケーション構成はイベント ハンドラーに渡され、イベントでpostLoad、構成設定Userを必要とする適切なエンティティに挿入します。

于 2012-05-21T06:31:49.970 に答える