1

データモデルオブジェクトがありますUser。私のアプリには、他にもいくつかのデータモデルオブジェクトがForkありOptionsます。たとえば、ユーザーにはフォークとブランチがあります。私のアプリは、ユーザー/フォーク/オプションなどの情報を組み合わせて多くのクエリを実行する必要があります。たとえば、ユーザーのフォークのページを表示できます。これには、フォークでそのユーザー(セッションにログインしているユーザーなど)を結合するクエリが必要になります。

私はデメテルの法則に違反したくありません。また、一般的にゲッター(およびセッター)にも反対しているので、User::getID()またはを実装したくありませんUser::getUsername()

しかし、代替案は私にはそれほど良くは思えません。結局起こったことは、Userこれらのクエリを実行するためにさまざまなメソッドを実装することです(例User::getForks())。一般的にこれは機能しますが、Userクラスはモノリシックになり、それ自体が悪いです。

さらに、2つのデータモデルオブジェクトのクエリをどのように解決するかがわかりません。たとえばUser、IDを持つaとIDを持つaForkがあり、フォークがユーザーに属していることを確認したい場合があります。これにはFork、IDをユーザーに公開するUserか、IDをに公開するかFork、または両方がIDをコントローラー(またはその他)に公開する必要があります。これらはどれも望ましいとは思えず、どちらを選択すればよいかわかりません。私が見逃している他の選択肢はありますか?

別の同様の手順で、ビューに情報を追加するための最良の方法がわかりません。私はビューオブジェクトを持っており、通常は、のようなメソッドを使用します。このメソッドは、1User::addForksToView(View $view)つまたは複数のクエリを実行し、いくつかの処理を実行しますが、これにより、のサイズと責任も増大しUserます。これも同様の問題だと思います。

4

1 に答える 1

1

オブジェクトgetForks内のメソッドではなく、またはそのようなものを使用します。ファクトリには、およびのようなメソッドを含めることができます。そうすれば、オブジェクトにはオブジェクトへの隠された依存関係がなく、おそらくデータベースアクセスへの隠された依存関係がありません。はデータベースに依存しており、データを取得して作成するためにのみ必要なコードが含まれています。これで、その方法を知ることができます。オブジェクトはデータベースに依存せず、オブジェクトは何も知る必要がないのに対し、実際にはまったく存在できず、気にしません。これは、単一目的のオブジェクトのアイデアです。UserForksFactoryfromUser(User $user)byId($id)UserForkForksFactoryForksForkUserForkForkUser

ゲッターとセッターに関しては、idやnameなどのプロパティをパブリックとして公開してみませんか?または、魔法のメソッド __getを使用して、__set必要に応じて、読み取り専用として扱われるプロパティを制御することもできます。それ以外の場合は、プロパティを公開することもできます-これは完全に許容されます。

あなたが言及する他のコードは、同じ問題に苦しんでいるように聞こえます-1つのオブジェクト、1つの目的。理論的には、すべてのオブジェクトは分離されているか、コンストラクターに依存関係が挿入されている必要があります。オブジェクトは、別のオブジェクトが定義されている必要はありません。そうしないと、そのメソッドの1つが失敗します。

于 2012-04-05T15:03:32.463 に答える