Давайте рассмотрим простой пример паттерна DAO . Пусть Person
является объектом значения, а PersonDAO
является соответствующей характеристикой, которая предоставляет методы для сохранения / извлечения Person
в / из базы данных.
trait PersonDAO { def create(p:Person) def find(id:Int) def update(p:Person) def delete(id:Int) }
Мы используем этот шаблон (в отличие от Active Record , например), если мы хотим разделить бизнес-домен и логику сохранения.
Что, если мы воспользуемся другим подходом ?
Мы создадим 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 = ... }
Теперь, если мы импортируем эти преобразования, мы можем написать клиентский код для управления Лица
и сохраняют / извлекают их в / из базы данных следующим образом:
val person1 = new Person ... person1.create ... val person2 = new Person ... person2.retrieve(id) ...
Этот код выглядит как Active Record
, но бизнес-домен и постоянство по-прежнему разделены.
Это делает смысл?