Как избежать этой проблемы при написании DAL? - PullRequest
0 голосов
/ 16 февраля 2020

Допустим, я хочу написать Персона 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).

Итак, наконец, мои вопросы: - Каково ваше мнение по этому поводу? - Какой подход вы используете, чтобы избежать подобных проблем?

1 Ответ

0 голосов
/ 16 февраля 2020

Вы можете попробовать использовать коллекцию пар ключ-значение для фильтрации. В зависимости от языка, который вы предпочитаете, он может называться словарем (Python) или картой (Java). По сути, key будет столбцом вашей таблицы, а value будет фактическим значением фильтра. Затем вы можете просто передать свой список пар ключ-значение.

GetAll(collection) {
  query = 'select * from persona where ';
  for (pair : collection) {
    addWhereToQuery(query, pair.key, pair.value)
  }

  // More filters here...
  return dbConn.Query(query, filters);
}

Приведенный выше подход является масштабируемым, более чистым, чем подход 1, и более эффективным, чем подход 2.

...