Помощь в архитектурном анализе для нового проекта

http://i.stack.imgur.com/YZXZN.png (я в настоящее время не разрешено вставлять изображения)

Мне действительно может понадобиться помощь с моей моделью класса выше. Мне стыдно признаться, что я был одним из «тех» разработчиков, которые изучили объектную ориентацию в университете, написали экзамены, сдали их, но потом так и не приступили к реализации принципов в моем реальном коде. Я никогда по-настоящему не садился и не обдумывал дизайн своего приложения, прежде чем приступить к его кодификации. Таким образом, мои навыки дизайна и кодирования медленно умирали и стагнировали под тяжестью разработки и обслуживания монолитных устаревших банковских приложений. После многих лет этого я решил, что это определенно время для изменений! Я глубоко погружался в мир шаблонов проектирования, DDD, NoSQL, DI и т. д. Последние 2 недели были для меня действительно напряженным опытом, и иногда мне кажется, что я чуть не расплакался от одного только объема. лучших практик и технологий, которые я пропустил, работая в крупных корпорациях и банках. Я просто не мог поверить, насколько я был далек от передовых технологий и хороших подходов к дизайну так долго, и внезапная полоса всего угрожала отправить меня в состояние паралича программирования! Я просто не мог начать программировать, так как чувствовал, что мой дизайн нуждается в дополнительной настройке или мне нужно больше изучать определенную тему. Однако этого достаточно, и мне нужно взяться за дело и хотя бы сделать первую итерацию проекта.

В любом случае, хватит драмы, по моему вопросу:

Я начал работу над созданием модели для моего приложения для игры в гольф. Желая немного придерживаться DDD, а также желая использовать NoSQL (RavenDB), я приступил к следующим требованиям.

  • Мой стек платформы — Windows/IIS/MVC 3.0/RavenDB.
  • Мне нужно найти мои совокупные корни! Я приступил к определению их как единственных элементов моей системы, способных сохраняться сами по себе. Все остальное я просто считал "подкомпонентом" агрегатов. Обратите внимание, что реальное поведение еще не определено.
  • Мои совокупные корни будут единственными классами, которые действительно сохранятся в моем хранилище документов RavenDB, и они будут сохраняться «как есть». Наличие больших древовидных структур классов, по-видимому, было бы лучшим сценарием для RavenDB с точки зрения реализованных преимуществ в производительности.
  • Я не чувствую необходимости в слое репозитория (следил за некоторыми сообщениями Айенде), поскольку API RavenDB кажется плавным и довольно легким. Я буду просто открывать и закрывать свои сеансы с помощью настраиваемых атрибутов действий на своих контроллерах, где это необходимо. Я видел, что без уровня репозитория тестирование может быть сложным, но, конечно же, я должен иметь возможность просто издеваться над некоторыми объектами домена «в памяти»?
  • Запись в БД будет происходить на отдельном сервисном уровне.
  • В какой-то момент я остановился и спросил себя: «Куда, черт возьми, я собираюсь поместить свое доменное поведение!?». Общий консенсус в результате поиска в Интернете, по-видимому, указывает на то, что я должен оставить свой домен (сущности) без какого-либо поведения (бизнес-логики) и все это обработать на моем сервисном уровне. Но после прочтения Эрика Эванса я убедился, что большая часть моего поведения в домене должна существовать прямо здесь... в домене!

Вопросы. Как добросовестный новичок в области DDD и архитектурного дизайна, я, по крайней мере, на правильном пути, или мне суждено погибнуть? - Будем очень признательны за любые мысли, предостережения, конструктивную критику и понимание вышеизложенного!


person ProxyTech    schedule 12.05.2012    source источник
comment
Кто сказал, что домен не должен содержать поведение? Серьезно, откуда это взялось, потому что я слышу это все время, но я никогда не видел, чтобы какие-либо хорошо зарекомендовавшие себя разработчики или книги говорили об этом? Чтобы помочь вам/запутать вас еще больше, загляните в мой блог на эту тему: lucidcoding.blogspot.co. Великобритания   -  person Paul T Davies    schedule 14.05.2012


Ответы (3)


Чтобы противостоять излишней академичности во всем этом и слишком долго застревать в анализе: сначала заставьте это работать. Тогда сделай красиво.

Поместите поведение как можно ближе к данным. Используйте службы, в которых вы не можете четко назначить ответственность классу (например, должен ли метод «перевода денег» быть в классе SavingsAccount?). Услуги могут быть частью агрегата.

Используйте репозитории (я не согласен с Айенде). Вы упоминаете об использовании отдельного сервисного слоя для записи в БД. Репозиторий — идеальный интерфейс, чтобы оставить этот слой позади. Это также идеальный шов для тестирования.

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

При выборе агрегатных корней важным критерием является жизненный цикл. Когда совокупный корень умирает, умирает и все остальное в совокупности. Совокупный корень также находится под контролем, через него проходит все, что находится за пределами совокупности. Если вы сомневаетесь, просто создайте их много (агрегат из одной сущности). В базе данных документов вы обычно храните документ для каждого агрегата, так что это в некоторой степени соответствует тому, как вы их выбираете. Храните идентификаторы ссылок на разные агрегаты.

person Community    schedule 12.05.2012
comment
Большое спасибо за советы! Люблю общее правило о том, когда пользоваться сервисом! Мне было интересно, зачем мне в первую очередь нужен сервисный уровень, если я чувствую, что все поведение может быть инкапсулировано в моей модели. Я также склоняюсь к использованию репозиториев, поскольку вижу, что для чтения потребуется некоторая логика для правильного построения моих классов, и я никоим образом не хочу, чтобы эта логика была рассеяна по всему проекту. Я действительно хочу строить свои классы/агрегированные корни с учетом будущих потребностей в производительности и вижу, что производительность будет лучше при большем совокупном корне. - person ProxyTech; 13.05.2012

Так что да, погружение в кроличью нору не повысит вашу производительность в краткосрочной перспективе, но может помочь вам стать разработчиком в долгосрочной перспективе. Существует так много DDD, NoSQL и т. д., что вы могли бы потратить годы только на изучение.

Если вы хотите, чтобы ваш следующий проект был успешным, я бы посоветовал вам придерживаться того, что вы знаете, и постепенно внедрять новые методы, чтобы вы всегда могли чувствовать полный контроль и не зависеть от «лучших практик», которые кто-то должен терпеть. ты.

person driushkin    schedule 12.05.2012
comment
Фантастический совет! Я в значительной степени думал об этом, но наличие кого-то в сообществе, подтверждающее мою позицию, просто помогает мне мягко подтолкнуть меня к работе. Самостоятельная разработка может быть довольно пугающей, если вы всегда привыкли к роскоши (да, временами к боли) больших команд разработчиков, которые помогают сосредоточить и направить усилия по разработке. - person ProxyTech; 13.05.2012
comment
Я совершенно не согласен с этим. Не просто «придерживайтесь того, что вы знаете» — учитесь на том, что вы знаете, и улучшайте это, а также учитесь на «лучших практиках» людей, которые имели дело с тем, что вы делаете, и имеют больше опыта, чем вы. - person Paul T Davies; 14.05.2012
comment
@PaulTDavies Я полагаю, что вывод для меня из вышеизложенного заключался не в том, чтобы просто отмахнуться от богатства знаний и передового опыта, но в то же время не позволить желанию получить знания парализовать человека, заставив его никогда на самом деле не принимать этот первый шаг и запись кода. - person ProxyTech; 16.05.2012

Во-первых, позвольте поздравить вас с решением предпринять шаги, чтобы попытаться стать более профессиональным. Я отчаиваюсь из-за отсутствия профессии в этой отрасли и иногда чувствую, что иду среди 80% ковбоев/хакеров и 20% профессионалов.

На ваш вопрос:

  • Вы читали эту статью Вона Верона? Если нет, вы должны. Он представляет собой отличное руководство по проектированию агрегатов, которое, как мне кажется, недооценивают из-за его сложности.
  • Глядя на вашу модель, я не уверен, действительно ли вы определили агрегаты? Я вижу, что вы определили корни агрегации, но агрегации должны иметь четкие границы и быть отделены от других агрегаций (т. е. не иметь объектов, ссылающихся на другие агрегированные корни, пусть они ссылаются на свой идентификатор). Имя свойства RefereeUserIDList намекает на то, что вы на самом деле это делаете, но на диаграмме показано, что оно содержит ссылку на реальный корень агрегата User?
  • С точки зрения определения агрегатов и корней и дизайна модели, я не думаю, что мы можем помочь вам здесь, поскольку это полностью косвенно связано с поведенческими требованиями. Однако я скажу: старайтесь основывать свой дизайн на поведении, а не на структуре данных. Трудно изменить образ мышления, но постарайтесь не представлять себе структуру базы данных.
  • Я не читал, что Айенде сказал о репозиториях, но пока вы можете издеваться над Raven API (что, я полагаю, вы можете, учитывая, что он делал моки Rhino), это не должно быть проблемой.
  • Возможно, самое главное, не размещайте всю логику вашего домена на уровне сервиса. Вы получите анемическую доменную модель, которая в DDD эквивалентна антихристу. .
  • Лично я, изучая DDD, понимал все принципы, но с трудом пытался применить теорию на практике. Если честно, я бы сказал, что действительно добился успеха с ним только после того, как понял принципы CQRS, что дополняет DDD. Я очень рекомендую посмотреть несколько видеороликов на эту тему от Грега Янга.
person David Masters    schedule 18.05.2012
comment
Да, я понимаю, к чему вы пришли от Дэйва в отношении моих агрегатов. Я думаю, что я сохранил границы достаточно последовательными, но я определенно нарушаю правило четких границ в отношении RefereeUserIDList. Моя проблема в том, что я попытался применить два подхода к смене парадигмы. Я использую RavenDB (NoSQL) и пытаюсь использовать более DDD-подход к дизайну. Поначалу было сложно, так как я начал с одного массивного корня агрегата (следовательно, с одним агрегатом). Я думал, что это будет здорово для RavenDB и производительности, но определенно не для архитектурной простоты. - person ProxyTech; 18.05.2012
comment
Думаю, я могу полностью согласиться с вашим последним пунктом. Я действительно чувствую, что у меня есть четкое представление о многих из этих теорий и лучших практик, а затем я начинаю с довольно простого надуманного примера из реального мира, и я начинаю сомневаться в себе и задаваться вопросом, не пропустил ли я где-то лодку. В конце концов мне просто пришлось принять решение с чего-то начать и ОБЕЩАТЬ себе вернуться и провести рефакторинг кода и дизайна на более позднем этапе, когда мое понимание и знания увеличатся (знаменитые последние слова для разработчика). Спасибо за слова поддержки и помощи! - person ProxyTech; 18.05.2012