Является ли шаблон DAO устаревшим в Scala? - PullRequest
9 голосов
/ 26 марта 2011

Давайте рассмотрим простой пример шаблона DAO .Пусть Person - это объект значения, а PersonDAO - соответствующая черта, которая предоставляет методы для хранения / извлечения Person в / из базы данных.

trait PersonDAO {
  def create(p:Person)
  def find(id:Int)
  def update(p:Person)
  def delete(id:Int)
}

Мы используем этот шаблон (в отличие от Active Record * (например, 1010 *), если мы хотим разделить бизнес-домен и логику постоянства.

Что, если вместо этого мы используем другой подход ?Мы создадим PersonDatabaseAdapter

trait PersonDatabaseAdapter{
  def create
  def retrieve(id:Int)
  def update
  def delete
}

и неявное преобразование из Person в него.

implicit def toDatabaseAdapter(person:Person) = new PersonDatabaseAdapter {
  def create =  ...
  def retrieve(id:Int) = ...
  def update = ...
  def delete = ...
}

Теперь, если мы импортируем эти преобразования, мы можем написатьклиентский код для манипулирования Persons и сохранения / извлечения их из базы данных следующим образом:

val person1 = new Person
...
person1.create
...
val person2 = new Person
...
person2.retrieve(id)
...

Этот код выглядит как Active Record, но бизнес-домен и постоянство по-прежнему разделены.

Имеет ли это смысл?

Ответы [ 4 ]

7 голосов
/ 26 марта 2011

Ну, я ничего не знаю о "устаревших" скороговорках.Шаблон - это шаблон, и вы используете его там, где это необходимо.Кроме того, я не знаю, должен ли какой-либо шаблон быть устаревшим в языке, если сам язык не реализует его с той же функциональностью.

Насколько мне известно, объект доступа к данным не устарел:

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

http://en.wikipedia.org/wiki/Data_access_object

2 голосов
/ 11 апреля 2011

Мне кажется, что вы все еще используете шаблон DAO.Вы просто реализовали это по-другому.

Я действительно нашел этот вопрос, потому что я исследовал, мертв ли ​​шаблон DAO в простой старой Java, учитывая мощь Hibernate.Похоже, что Hibernate Session является общей реализацией DAO, определяющей такие операции, как создание, сохранение, saveOrUpdate и т. Д.

На практике я не видел особой ценности в использовании шаблона DAO.При использовании Hibernate интерфейсы и реализации DAO являются избыточными обертками вокруг однострочных идиом Hibernate Session, например, getSession (). Update (...);

В результате вы получаете дублированные интерфейсы - Сервисинтерфейс, который переопределяет все методы в интерфейсе DAO, а также некоторые другие, реализованные в терминах этих.

Кажется, что Spring + Hibernate сократил логику персистентности почти до тривиальности.Переносимость технологии постоянства НЕ требуется почти во всех приложениях.Hibernate уже дает вам переносимость базы данных.Конечно, DAO дадут вам возможность перейти с Hibernate на Toplink, но на практике этого никогда не сделать.Технологии персистентности уже являются утечкой абстракций, и приложения создаются для того, чтобы справиться с этим фактом, например, с загрузкой прокси-сервера для установления связей или выполнения попаданий в базу данных, что обязательно связывает их с технологией персистентности.Быть связанным с Hibernate на самом деле не так уж и плохо, так как он делает все возможное, чтобы уйти с дороги (нет проверенных исключений в духе JDBC и прочей чепухи).

В целом, я думаю, что ваша реализация ScalaШаблон DAO хорош, хотя вы, вероятно, могли бы создать полностью универсальный миксин, который давал бы базовые операции CRUD любому объекту (большинство компетентных разработчиков, как правило, также реализуют базовый класс «универсальный DAO» в Java).Это то, что делает Active Record?

/ конец случайных комментариев /

0 голосов
/ 31 мая 2017

В настоящее время я замечаю, что шаблон Repository довольно популярен, особенно потому, что его терминология делает его похожим на то, что вы имеете дело с коллекциями.

0 голосов
/ 29 июля 2015

Я полагаю, что ваш PersonDatabaseAdapter мутирует Person в его retrieve(id: Int) методе.Таким образом, этот шаблон заставляет ваши доменные объекты быть изменяемыми, в то время как сообщество Scala, похоже, предпочитает неизменность из-за функциональной природы (или особенностей) языка.

В остальном, я думаю, что шаблон DAO все еще имеет те же преимуществаи недостатки (перечислены здесь ) в Scala, как и в Java.

...