可能な限りOOPコードの設計を改善したいと思っていますが、この問題に悩まされています。
たとえば、ソーシャルネットワーキングサイトで、ユーザーのすべての友達のプロファイルを取得したいとします。だから私はテーブルFriendships
とを持っていProfiles
ます。そして、私はクラスFriends
とを持っていますProfile
。
Friends
ユーザーの友情を処理するクラスであり、Friends::getFriendsProfiles()
すべてのユーザーの友達のプロファイルをフェッチして返す関数であるとします。
だから私の関数のFriends::getFriendsProfiles()
中で私はどちらかを行うことができます
テーブル結合(例
SELECT * FROM Friends LEFT JOIN Profiles ON Friends.user2 = Profile.userId WHERE Friends.user1 = :userid
)、または友達のユーザーIDを取得し、
Profile
友達IDごとにオブジェクトを作成し$profile->getProfile($friendid)
、クエリ(SELECT * FROM Profiles WHERE userId = $friendid
)を実行して友達のプロファイルを取得する呼び出しを行うだけです。次に、すべての友達のProfile
オブジェクトのセットを返します。
オプション1短所:私の友情クラスはプロファイルについて知っています。また、プロファイルが返される方法を変更する必要がある場合(たとえば、各プロファイルオブジェクトに別のプロパティを追加したい場合)、2つの異なる場所で変更する必要があります。
オプション2の短所: 1つのクエリ(O(1)で実行する必要があると思いますか?)を作成する代わりに、O(n)になります。ここで、nはユーザーの友達の数です。
しかし、オプション2は非常にクリーンで、緩く結合されています。どのオプションを選択する必要がありますか?