The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Кто-то спросил меня, что я думаю о DAO, и я понял, что, хотя я писал об ORM, DTO и геттерах, мне еще не довелось упомянуть о DAO. Вот мое мнение: это такой же позор, как и его друзья - ORM, DTO и геттеры. Вкратце, объект доступа к данным - это объект, который предоставляет абстрактный интерфейс к некоторому типу базы данных или другому механизму хранения данных. Цель благородна, но реализация ужасна.
Вот, как это может выглядеть:
Идея проста - метод find()
создает DTO Book
, кто-то еще внедряет новые данные в него и вызывает update()
.
Что не так, вы спросите? Все, что было неправильно с ORM, но вместо “сессии” у нас есть этот DAO. Проблема остается той же: book
- не объект, а контейнер данных. Я процитирую свое трехлетней давности заявление из статьи об ORM с небольшим изменением в названии: “DAO, вместо инкапсуляции взаимодействия с базой данных внутри объекта, отделяет его, буквально разрывая сплоченный и согласованный живой организм”. Для получения более подробной информации, пожалуйста, ознакомьтесь с этой статьей.
Однако, я должен сказать, что у меня есть нечто подобное DAO в большинстве моих личных проектов, но они не возвращают и не принимают DTO. Вместо этого они возвращают объекты и иногда принимают операции с ними. Вот несколько примеров. Посмотрите на этот интерфейс Pipes
из Wring.io:
Его метод add()
создает новый элемент в “коллекции”, а метод pipe()
возвращает один объект из коллекции. Pipe
не является DTO, это обычный объект, который полностью способен выполнять все необходимые операции с базой данных без помощи DAO. Например, есть метод Pipe.status(String)
для обновления его статуса. Я не собираюсь использовать Pipes
для этого, я просто делаю pipe.status("Привет, мир!")
.
Вот еще один пример из Jare.io: интерфейс Base
, который возвращает список объектов типа Domain
. Затем, когда мы хотим удалить домен, мы просто вызываем domain.delete()
. Домен полностью способен выполнять все необходимые манипуляции с базой данных.
Проблема с DAO находится прямо в его названии, я считаю. Он говорит, что мы получаем доступ к “данным” и делает именно это: обращается к базе данных, извлекает некоторые данные и возвращает данные. Не объект, а данные, также известные как “объект передачи данных”. Как мы уже обсуждали ранее, прямые манипуляции с данными нарушают инкапсуляцию и делают объектно-ориентированный код процедурным и подверженным уродливости.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-27 at 10:36