具体的な問題
私はいくつかの会社(エンティティ)を操作するオブジェクトA(エンティティ)を持っています。会社は互いにリンクできます(たとえば、共通の株主がいる場合)。会社C1が会社C2にリンクされているかどうかをAに知らせたい。
気持ち
私の知識と習慣の範囲内で、会社のエンティティには、それが別のエンティティと接続されているかどうかを判断する方法があるはずだと思います(ポイント1)。もちろん、会社のすべての接続を取得し、会社のC2がそこにあるかどうかを確認することでそれを行うことができます(ポイント2)。しかし、これは汚いです、それはどのような理由ですべての依存関係を取得することを意味しますか?データベースから簡単に取得できるブール値を取得して、企業にリンクされたリポジトリで関数を作成することを考えることができました(ポイント3)。ただし、エンティティ(AまたはC1とC2のいずれか)で使用できるものがないため、軽量オブジェクトは記憶します。
議論
- ポイント1は、単一責任の原則に基づいています。その点を自由に批判してください。エンティティはモデルロジックを埋め込むことになっているので、isConnectedWith関数はCompanyEntityの定義に正しく含まれている必要があると思います。ここで、Aもエンティティであることを覚えておいてください(したがって、ここにもリポジトリがあります)
- ポイント2は解決策であり、ある意味で優れています。Doctrineがシミュレートしているだけが真実である場合、それが大きな場合、それは正しい方法です。単に
$object->connexions
メモリ内のどこかにすでに存在するオブジェクトコレクションにアクセスして呼び出す場合。しかし、真実はひどいです:それはそこにありません、それは私たちのウェブアプリの一般的なボトルネックでした:データベース。 - ポイント3データマッパーと依存性注入の組み合わせにうんざりしていて、エンティティ(およびビットリポジトリ)はモデルロジックであるため、それ自体だけで動作する必要があると言っています。私の理解はひどく間違っているかもしれませんが、誰もがそれは悪いことだと言っているので、エンティティにヘルパーや構成を注入するという考えを完全に捨てました。
質問
整合性とパフォーマンスを維持し、汚い回避策を回避する問題をどのように解決しますか?私の議論のどの点が悪いですか?