4

具体的な問題

私はいくつかの会社(エンティティ)を操作するオブジェクトA(エンティティ)を持っています。会社は互いにリンクできます(たとえば、共通の株主がいる場合)。会社C1が会社C2にリンクされているかどうかをAに知らせたい。

気持ち

私の知識と習慣の範囲内で、会社のエンティティには、それが別のエンティティと接続されているかどうかを判断する方法があるはずだと思います(ポイント1)。もちろん、会社のすべての接続を取得し、会社のC2がそこにあるかどうかを確認することでそれを行うことができます(ポイント2)。しかし、これは汚いです、それはどのような理由ですべての依存関係を取得することを意味しますか?データベースから簡単に取得できるブール値を取得して、企業にリンクされたリポジトリで関数を作成することを考えることができました(ポイント3)。ただし、エンティティ(AまたはC1とC2のいずれか)で使用できるものがないため、軽量オブジェクトは記憶します。

議論

  • ポイント1は、単一責任の原則に基づいています。その点を自由に批判してください。エンティティはモデルロジックを埋め込むことになっているので、isConnectedWith関数はCompanyEntityの定義に正しく含まれている必要があると思います。ここで、Aもエンティティであることを覚えておいてください(したがって、ここにもリポジトリがあります)
  • ポイント2は解決策であり、ある意味で優れています。Doctrineがシミュレートしているだけが真実である場合、それが大きな場合、それは正しい方法です。単に$object->connexionsメモリ内のどこかにすでに存在するオブジェクトコレクションにアクセスして呼び出す場合。しかし、真実はひどいです:それはそこにありません、それは私たちのウェブアプリの一般的なボトルネックでした:データベース。
  • ポイント3データマッパーと依存性注入の組み合わせにうんざりしていて、エンティティ(およびビットリポジトリ)はモデルロジックであるため、それ自体だけで動作する必要があると言っています。私の理解はひどく間違っているかもしれませんが、誰もがそれは悪いことだと言っているので、エンティティにヘルパーや構成を注入するという考えを完全に捨てました。

質問

整合性とパフォーマンスを維持し、汚い回避策を回避する問題をどのように解決しますか?私の議論のどの点が悪いですか?

4

1 に答える 1

4

ポイントを分析してみましょう

ポイント3

ポイント3はまったく解決策ではありません!エンティティにほとんどすべてを注入することは良い解決策ではないと誰が言ったのか、絶対に正しいです。これは、OOおよびパターンプログラミングのベストプラクティスのほぼ「デファクトスタンダード」です。
エンティティは「オブジェクト」を表すためだけに存在するため(もちろん、ITアクセプタンスではありません!)、プロパティとアクセサメソッドだけを含める必要があります。
時間の経過とともに変化する可能性のあるもの(メソッドのシグネチャ、メソッドの戻りタイプ、またはロジック)を注入する状況について考えてみてください。その場合、物事を連携させるためにエンティティ自体を変更する必要がありますが、なぜこれを行う必要があるのですか?エンティティ、それは変更されていませんか?これはオブジェクト指向プログラミングの良い出発点であるため、深く考えてください(symfony2やエンティティ表現のみではありません!)

ポイント2

はい、その通りです。DBからすべてのエンティティをフェッチするのはなぜですか。「適切な」クエリを作成する場合は、検索しているエンティティのみをフェッチするのはなぜですか。
この点については、次のようなものを分析する必要があります。

  • この(またはそれらの)エンティティを他の場所で使用する必要があるので、フェッチするとよいでしょうか?
  • Doctrine2がオブジェクトをフェッチする場所(*)をメモリに保持することを私は知っていましたか?つまり、以前にフェッチされた同じオブジェクトをクエリ(または要求)すると、彼はそのオブジェクトの同じインスタンスを返しますか?したがって、DB接続、フェクト、ヘビーウェイト操作はありません。

ポイント1

はい、これは良い点です。(もちろん、リポジトリに!)->isThere()またはより良いメソッドを実装する必要があります(これは頭に浮かんだファーストネームです)。
このメソッドを使用すると、フラグまたは整数(または集計関数で取得)のみを返すカスタムSQL( D QLと呼ばれます。DはDoctrineを表します)を記述できます。エンティティのではなくスカラーの結果を フェッチするには、名前が示すように、 この最後のソリューションに傾くと思います。COUNT(*)
ArrayCollection$query->getSingleScalarResult();

すべてをうまく説明したことを願っています


(*)これはアイデンティティマップと呼ばれます

于 2013-03-01T09:26:12.130 に答える