Краткая справка: я программирую на PHP, у меня есть модель домена с отдельным уровнем доступа к данным (классы DAO), которые отвечают за выборку данных из БД и создание классов домена.
Допустим, у меня есть класс DAO, отвечающий за создание объектов group и groupList . Вы можете представить группы как компонент социальной сети; хотя на самом деле не имеет значения, что они за этот вопрос.
Мне нужно иметь возможность попросить DAO сделать меня различными groupList объектами на основе различных критериев:
- последние добавленные группы
- самые популярные группы
- группы, определенные администратором как "избранные"
- групп, помеченных определенным тегом
- групп, соответствующих определенному ключевому слову
- группы в определенной категории
- групп, созданных определенным человеком
- групп, созданных в определенный день
Некоторые из них на самом деле мне сейчас не нужны, но я могу себе представить, что они понадобятся мне до того, как проект будет завершен. Теперь я начал с хорошего простого метода 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 (categoryObject)
- createUsersList (userObject)
- createTagList (tag)
- createPopularList ()
или
b) создать один БОЛЬШОЙ метод, который может делать все:
- createList (searchString, orderBy, filterByCategoryObject = null, filterByUserObject = null)
Мне очень нравится идея (а), потому что мой интерфейс DAO проще и менее вероятно нуждается в изменении (например, добавление другого параметра, когда мне вдруг нужно передать дату для сравнения) Трудность возникает, когда у вас есть такие вещи, как ключевые слова поиска, которые вы хотите объединить с другими параметрами; Например: поиск по списку категорий, поиск по популярному списку, поиск по списку тегов и т. д. (а) это то, с чего я начал.
У меня был флирт с рефакторингом в (b), но я вижу, что мой метод становится очень большим и очень сложным, довольно быстрым, много "если" и "выбирают", чтобы иметь дело с различными случаями при построении SQL и множество параметров, которые вводятся в метод. Но, по крайней мере, все это в одном месте. И вы можете комбинировать вещи; Например: группы пользователей, помеченные бла, соответствующие ключевые слова бла.