Каковы преимущества постоянного невежества? - PullRequest
37 голосов
/ 25 мая 2009

Я новичок в мире DDD + TDD. Но я занимаюсь программированием почти 9 лет.

Может кто-нибудь объяснить мне преимущества невежества упорства? Типичное приложение nHibernate просто выдвигает зависимость между классом и базой данных для сопоставления файлов.

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

Наконец, как я могу проверить файлы сопоставления? Есть вероятность того, что в файлах сопоставления появятся ошибки, как их проверить?

Ответы [ 3 ]

47 голосов
/ 25 мая 2009

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

Псевдокод:

trx = connection.CreateTransaction();
query = connection.CreateQuery("Select * from Employee where id = empid");
resultset = query.Run();
resultset.SetValue("Address_Street", "Bahnhofstrasse");
resultset.SetValue("Address_City", "Zürich");
trx.Commit();

С NHibernate это будет выглядеть примерно так:

emp = session.Get<Employee>(empid);

// persistence ignorant 'logic'
emp.Address.Street = "Bahnhofstrasse";
emp.Address.City = "Zürich";

session.Commit();

Постоянство Невежество означает, что сама бизнес-логика не знает о постоянстве. Или, другими словами, постоянство отделено от логики. Это делает его намного более пригодным для повторного использования.

Переместить «логику» в метод многократного использования:

void MoveToZuerichBahnhofstrasse(Employee emp)
{
  // doesn't have anything to do with persistence
  emp.Address.Street = "Bahnhofstrasse";
  emp.Address.City = "Zürich";
}

Попробуйте написать такой метод, используя наборы результатов, и вы знаете, что такое постоянное невежество.

Если вы не уверены, посмотрите, насколько простым будет модульный тест, потому что нет никаких зависимостей от вещей, связанных с постоянством:

Employee emp = new Employee();
MovingService.MoveToZuerichBahnhofstreasse(emp);
Assert.AreEqual("Bahnhofstrasse", emp.Address.Street);
Assert.AreEqual("Zürich", emp.Address.City);

DDD - это что-то другое. Там вы сначала строите модель своего домена (модель класса) и создаете дизайн базы данных в соответствии с ней. С NH это очень просто, потому что - благодаря постоянному невежеству - вы можете написать и выполнить модульное тестирование модели и логики, прежде чем иметь (окончательную) модель базы данных.


Тестирование. Мы тестируем сопоставления, создавая экземпляр объекта, сохраняя его в базе данных, возвращая его и сравнивая. Это делается автоматически с большим количеством размышлений. Но вам не нужно идти так далеко. большинство типичных ошибок появляются при попытке сохранить сущность.

Вы можете сделать то же самое с запросами. Сложные запросы заслуживают проверки. Это наиболее интересно, если запрос вообще скомпилирован. Вам даже не нужны никакие данные для этого.

Для тестов интеграции баз данных мы используем Sqlite . Это довольно быстро. NH создает базу данных в памяти на лету, используя SchemaExport (перед каждым тестом).

7 голосов
/ 25 мая 2009

Я всегда думал о домене, и хотя я использовал хранимые процедуры, ADO.NET в прошлом, только когда я наконец перешел на NHibernate, я был удовлетворен своим механизмом персистентности.

Domain Driven Design (DDD) делает упор прямо на модель предметной области. Это означает, что основное внимание уделяется созданию концептуальной модели, которая формирует общий язык как для пользователей, так и для программистов. Пользователи почти НИКОГДА не интересуются тем, как вы сохраняете их информацию. NHibernate помогает вам достичь этого мышления, делая постоянную заботу второстепенной по отношению к захвату бизнес-правил и пониманию того, что пользователь действительно хочет от системы.

Свободный NHibernate уменьшает влияние изменений в модели вашего домена на базовые файлы сопоставления. Он также имеет автоматическое отображение . Хотя вы никогда не можете полностью игнорировать постоянство для вашей системы, NHibernate с Fluent NHibernate позволяет вам сосредоточиться на модели домена. Если вы не сосредоточены на использовании богатой модели предметной области, NHibernate не принесет никаких преимуществ.

Что касается тестирования ваших сопоставлений, вы будете писать тесты (или ДОЛЖНЫ быть) независимо от того, какой метод вы используете для реализации постоянства. Это не лишняя работа, которая появляется только потому, что вы используете NHibernate. Просто подумайте о том, чтобы проверить свои отображения как проверку того, что ваше постоянство работает правильно.

Опять же для этого Свободный NHibernate неоценим. У него есть Тестирование характеристик устойчивости , которое действительно просто использовать в большинстве случаев.

2 голосов
/ 25 мая 2009

PI не об использовании NHibernate. PI означает игнорирование того, как будут храниться данные, при разработке модели предметной области. И да, это продвигает зависимость, добавляя еще один уровень абстракции. DDD не революционен - ​​это скорее идея, подход к кодированию с использованием уже знакомых шаблонов (большинство из них). То есть - фабричный шаблон или шаблон модуля тоже не нов, но довольно важная часть DDD.

Я тоже начал использовать NHibernate совсем недавно, так что не могу рассказать об этом подробнее. Но у меня есть один совет, который может быть полезен для вас - попробуйте Свободный NHibernate , если вы еще этого не сделали.

...