@Orioss

Как использовать интерфейс DAO?

Делаю простое web приложение на сервлетах.
Имеются две таблицы
create table users
(
    id       SERIAL PRIMARY KEY,
    username char(20)  UNIQUE NOT NULL,
    email    char(100) UNIQUE NOT NULL,
    password char  NOT NULL
);

create table todo
(
    uuid          char(36) PRIMARY KEY,
    title         char(100),
    user_id       int REFERENCES users (id),
    creation_date date,
    done          bool      default FALSE
);


Планировал реализовать выборку нужных данных через паттерн DAO.
public interface Dao<K, T> {
    T create(T entity);

    List<T> getAll();

    Optional<T> getByPK(K key);

    boolean update(T entity);

    boolean delete(K key);
}

Данный интерфейс реализован в TodoDao и UserDao.

Однако при реализации возникают вопросы:
1. Что делать, если все методы из интерфейса Dao для User не нужны(Обновлять и удалять данные о пользователе не планирую), все равно писать их реализацию?
2. Помимо тех методов что есть в интерфейсе Dao, для Todo будет нужен метод GetAllByUser, получается его отдельно реализовывать в классе TodoDao?
3. Из 1 и 2 вопроса вытекают итоговый вопрос: как правильно поступить с интерфейсами Dao? Один интерфейс для всех или отдельные интерфейсы для Todo и User, в которых будут только нужные методы?

В случае если делать отдельный интерфейс для каждого класса, в дальнейшем можно будет без проблем сделать реализацию выборки через не через JDBC а через что-либо другое(Это как аргумент в пользу нескольких интерфейсов), плюс не нужно писать реализацию ненужных методов. Однако наличие нескольких интерфейсов настораживает, будто бы правильнее сделать один общий.

P.S прошу дать однозначный обоснованный ответ. Т-как тяжело понять на каком решении остановиться.
  • Вопрос задан
  • 224 просмотра
Решения вопроса 2
xez
@xez Куратор тега Java
TL Junior Roo
1. Если методы не нужны - не нужно их добавлять в интерфейс, тем более реализовывать.
2. Нужно в интерфейсе UserDAO объявить, а затем реализовать нужный метод.
3. В SOLID буква I - это "interface segregation principle" - несколько маленьких специализированных интерфейсов лучше, чем один большой.
Ответ написан
@Dementor
программист, архитектор, аналитик
Сделай общий интерфейс Dao с общими методами, а потом сделай наследованием DaoUser и DaoTodo, в которые добавь недостающие специфические для сущностей методы.

Делать единый контракт для доступа к данным двух типов - это плохая идея. Если добавить заглушку для "ненужных методов" и возвращать Null, то можно забыть и в будущем напороться. А если имплементировать "не нужное", то потом "тащить" и поддерживать - однозначно пустая трата времени.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы