2

http://i.stack.imgur.com/YZXZN.png (я в настоящее время не допускается вставлять изображения)Архитектурный анализ помощь для нового проекта

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

Во всяком случае, достаточно драмы, на мой вопрос:

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

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

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

+0

Кто сказал, что в домене не должно быть поведения? Серьезно, откуда это происходит, потому что я все время слышу, но я никогда не видел, чтобы какие-либо хорошо зарекомендовавшие себя разработчики или книги говорили об этом? Чтобы помочь вам/запутать вас дальше, пожалуйста, посмотрите мой блог на эту тему: http://lucidcoding.blogspot.co.uk/ –

ответ

3

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

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

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

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

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

+0

Большое спасибо за советы! Любите общее правило о том, когда пользоваться услугой! Интересно, почему я хотел бы использовать сервисный уровень, если бы я чувствовал, что все поведение может быть инкапсулировано в мою модель. Я также склоняюсь к использованию репозиториев, поскольку я вижу, что мои «чтения» потребуют некоторой логики для правильной сборки моих классов, и я не хочу, чтобы эта логика рассеялась вокруг проекта. Я хочу построить свои классы/совокупные корни с учетом будущих потребностей в производительности и увидеть, что производительность будет лучше для большего совокупного корня. – ProxyTech

0

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

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

+0

Фантастический совет! Я довольно много думал об этом, но, если кто-то в сообществе подтвердил мою позицию, это просто помогает мне нежно работать, мне нужно идти. Это может быть довольно сложным развитием, когда человек всегда привык к роскоши (да порой боль) больших групп разработчиков, чтобы помочь сосредоточиться и направлять усилия по развитию. – ProxyTech

+2

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

+0

@PaulTDavies Я предполагаю, что выезд для меня из вышеизложенного заключался не в том, чтобы просто отбросить богатство знаний и лучших практик там, но в то же время не позволить желанию получить знания, парализующие один навсегда сделав этот первый шаг и опуская некоторый код. – ProxyTech

0

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

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

  • Вы читали this article от Vaughn Верон? Если нет, вы должны. Он предоставляет отличный руководство по проектированию агрегатов, которое, как мне кажется, недооценивается по своей сложности.
  • Глядя на вашу модель, я не уверен, действительно ли вы определили агрегаты? Я вижу, что вы определили совокупность корней, но агрегаты должны иметь четкие границы и быть отделены от других агрегатов (т. Е. Не имеют сущностей, ссылающихся на другие корни совокупности, пусть они ссылаются на их идентификатор). Имя свойства RefereeUserIDList подсказывает, что вы на самом деле это делаете, но на диаграмме показано, что он содержит ссылку на фактический «общий» пользовательский корень?
  • С точки зрения идентификации агрегатов & корни & дизайн модели, я действительно не думаю, что мы можем помочь вам здесь, поскольку это полностью косвенно связано с поведенческими требованиями. Я скажу, хотя: попробуйте основывать свой дизайн на поведение, а не структуру данных. Это сложное мышление, к которому нужно перейти, но не пытайтесь представить структуру базы данных.
  • Я не читал, что сказал Айенде о хранилищах, но до тех пор, пока вы можете издеваться над API Raven (который, как я полагаю, вы можете дать ему издеваться над Rhino), это не должно быть проблемой.
  • Возможно, самое главное, не помещает всю вашу логику домена в сервисный уровень. В итоге вы получите Anemic domain model, что является DDD-эквивалентом антихриста.
  • Лично при изучении DDD я понял все принципы, но боролся, пытаясь превратить теорию в практику. Если честно, я бы сказал, что мне это действительно удавалось с тех пор, как я понял директоров CQRS, который дополняет DDD. Я бы порекомендовал посмотреть некоторые видео по теме на Greg Young.
+0

Да, я вижу, откуда вы пришли от Дейва к моим агрегатам. Я думаю, что я сохранил границы достаточно последовательно, но я определенно нарушаю правило «четких границ» в отношении RefereeUserIDList. Моя проблема в том, что я попытался применить два подхода к изменению парадигмы. Я использую RavenDB (NoSQL) и пытаюсь использовать DDD-подход с дизайном. Это было тяжело в начале, так как я начал с одного массивного совокупного корня (следовательно, одного агрегата). Я думал, что это будет потрясающе для RavenDB и производительности, но определенно не для архитектурной простоты. – ProxyTech

+0

Думаю, я могу полностью связать вашу последнюю точку. Я действительно чувствую, что у меня есть четкое понимание многих этих теорий и лучших практик, а затем я начинаю с довольно простого надуманного примера в реальном мире, и я начинаю второй догадываться сам и задаюсь вопросом, пропустил ли я когда-нибудь какую-нибудь лодку. В конечном итоге я должен был принять решение «начать где-то» и ОБРАТИТЬ себя, чтобы вернуться и реорганизовать код и дизайн на более позднем этапе по мере того, как мое понимание и знания увеличиваются (известные последние слова для разработчика). Спасибо за ваши слова поддержки и помощи! – ProxyTech

Смежные вопросы