Допустим, я хочу написать Персона DAL. Я могу придумать два подхода:
1) Как можно больше generi c, например:
GetAll(filters) {
query = 'select * from persona where ';
if (filters.id) {
addWhereToQuery(query, 'id');
}
if (filters.name) {
addWhereToQuery(query, 'name');
}
// More filters here...
return dbConn.Query(query, filters);
}
При таком подходе я всегда сталкиваюсь с некоторыми проблемами:
- Трудно придумать обобщенный c дизайн, который может работать для будущих изменений.
- Новые требования требуют более настраиваемых обобщенных c функций, например, давайте предположим, что теперь вы хотите иметь возможность чтобы привести любой из столбцов, вы можете добавить новый аргумент
castOptions
и его лог c. Это добавляет необходимость в более сильном тестировании, и функция становится более грязной и грязной с каждым изменением.
2) Подход Specifi c, такой как:
GetAll() {
query = 'select * from persona;';
return dbConn.Query(query);
}
GetById(id) {
query = 'select * from persona where id = ?;';
return dbConn.Query(query, id);
}
GetByName(name) {
query = 'select * from persona where name = ?;';
return dbConn.Query(query, name);
}
// More methods here
Мне нравится этот подход более, некоторые проблемы, которые я получаю:
- Проблемы с именами, например, я хочу получить всю персону по полу, местоположению и семейному положению, в итоге я пишу что-то вроде
GetAllBySexAndLocationAndMaritalStatus(sex, location, maritalStatus)
. - Если сейчас мне нужно что-то похожее на предыдущий метод, но для всей персоны по полу, не в этом месте и семейном положении, я получу другой метод, например
GetAllBySexAndNotInLocationAndMaritalStatus(sex, location, maritalStatus)
.
Итак, наконец, мои вопросы: - Каково ваше мнение по этому поводу? - Какой подход вы используете, чтобы избежать подобных проблем?