簡単な背景: 私は PHP でプログラミングしています。DB からのデータのフェッチとドメイン クラスの作成を担当する別のデータ アクセス層 (DAO クラス) を持つドメイン モデルがあります。
groupオブジェクトとgroupListオブジェクトの作成を担当する DAO クラスがあるとします。グループは、ソーシャル ネットワークのコンポーネントと考えることができます。ただし、この質問でそれらが何であるかは問題ではありません。
さまざまな基準に基づいてさまざまなgroupListオブジェクトを作成するように DAO に依頼できるようにする必要があります。
- 最近追加されたグループ
- 最も人気のあるグループ
- 管理者によって「おすすめ」として識別されたグループ
- 特定のタグが付けられたグループ
- 特定のキーワードに一致するグループ
- 特定のカテゴリ内のグループ
- 特定の人が作成したグループ
- 特定の日に作成されたグループ
これらのいくつかは、今は実際には必要ありませんが、プロジェクトが完了する前に必要になると想像できます. 今、私は素晴らしい単純な DAO メソッドであるcreateListから始めました。これはうまくいきました。擬似コードは次のように考えることができます。
find out how many groups
create SQL query to fetch group details
loop through results
{
create group object
add to group list object
}
アプリケーションの進行に合わせて、新しいメソッドcreateFeaturedListを作成しました。これはうまくいきました。しかし、実際にはcreateListと非常によく似ていて、クエリが少し異なります。約 150 行のコードの残りの多くは同一でした。
それで...必要なわずかに異なるすべてのケースについてどうすればよいですか? ほとんどの場合、特定の基準に基づいてリストをフィルタリングおよびソートしたいだけです。問題はこれです-私はすべきですか:
a)次のような集中的な作成方法をたくさん作成します。
- createList()
- createCategoryList( カテゴリオブジェクト )
- createUsersList ( userObject )
- createTagList (タグ)
- createPopularList ()
また
b)すべてを実行できる 1 つの BIG メソッドを作成します。 - createList ( searchString, orderBy, filterByCategoryObject=null, filterByUserObject=null )
私のDAOインターフェイスはよりシンプルで、変更する必要がほとんどないため、(a)のアイデアが非常に気に入っています(たとえば、比較するために突然日付を渡す必要があるときに別のパラメーターを追加する)他のパラメーターと組み合わせたいキーワード。例: 検索されたカテゴリ リスト、検索された人気リスト、検索されたタグ リストなど... (a) は、私が始めたもののようなものです。
(b) へのリファクタリングをいじりましたが、SQL を構築するときのさまざまなケースに対処するために、メソッドが非常に大きく、非常に複雑になり、多くの "if" と "select" が発生することがわかります。メソッドに渡される多くのパラメーター。しかし、少なくともすべてが 1 か所にあります。そして、物事を組み合わせることができます。例: blah でタグ付けされた、キーワード blah に一致するユーザーのグループ。