DAO is Yet Another OOP Shame

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

sixnines availability badge   GitHub stars