Кто-то спросил меня, что я думаю о DAO, и я понял, что, хотя я писал об ORM , DTO и добытчиках , у меня еще не было возможности упомянуть DAO. Вот мое мнение: это такой же позор, как и его друзья — ORM, DTO и добытчики. В двух словах, объект доступа к данным — это объект, который «предоставляет абстрактный интерфейс для некоторого типа базы данных или другого механизма персистентности». Цель благородна, но реализация ужасна.
Вот как это может выглядеть :
1
2
3
4
5
|
class BookDAO { Book find( int id); void update(Book book); // Other methods here ... } |
Идея проста — метод find()
создает Book
DTO , кто-то другой вводит в нее новые данные и вызывает update()
:
1
2
3
4
|
BookDAO dao = BookDAOFactory.getBookDAO(); Book book = dao.find( 123 ); book.setTitle( "Don Quixote" ); dao.update(book); |
Вы спрашиваете, что не так? Все, что было не так с ORM , но вместо «сессии» у нас есть этот DAO. Проблема остается той же: book
не объект, а контейнер данных. Я цитирую свое собственное трехлетнее утверждение из статьи ORM с небольшим изменением названия: «DAO вместо инкапсуляции взаимодействия с базой данных внутри объекта извлекает его, буквально разрывая прочный и сплоченный живой организм». Для более подробной информации, пожалуйста, проверьте эту статью.
Тем не менее, я должен сказать, что у меня есть что-то вроде DAO в большинстве моих любимых проектов , но они не возвращают и не принимают DTO. Вместо этого они возвращают объекты и иногда принимают операции с ними. Вот несколько примеров. Посмотрите на этот интерфейс Pipes
из Wring.io :
1
2
3
4
|
interface Pipes { void add(String json); Pipe pipe( long number); } |
Его метод add()
создает новый элемент в «коллекции», а метод pipe()
возвращает один объект из коллекции. Канал не DTO, это обычный объект, который полностью способен выполнять все необходимые операции с базой данных без помощи DAO. Например, есть Pipe.status(String)
для обновления его статуса. Я не собираюсь использовать Pipes
для этого, я просто делаю pipe.status("Hello, world!)
.
Вот еще один пример из Jare.io : интерфейс Base
который возвращает список объектов типа Domain
. Затем, когда мы хотим удалить домен, мы просто вызываем domain.delete()
. Домен полностью способен выполнять все необходимые манипуляции с базой данных.
Я считаю, что проблема с DAO прямо в ее названии. В нем говорится, что мы обращаемся к «данным» и делаем именно это: заходим в базу данных, извлекаем некоторые данные и возвращаем данные . Не объект, а данные, также известные как «объект передачи данных». Как мы уже говорили , прямые манипуляции с данными — это то, что нарушает инкапсуляцию и делает объектно-ориентированный код процедурным и не поддерживаемым.
Опубликовано на Java Code Geeks с разрешения Егора Бугаенко, партнера нашей программы JCG . Смотрите оригинальную статью здесь: DAO — еще один позор ООП
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |