Именование объектов домена, которые действуют как строительные блоки ddd, например репозитории

При объединении концепций в рамках модели предметной области, где существует что-то, имеющее имя и звучащее как объект, но перекрывающееся с ответственностью одного из 5 основных строительных блоков DDD, какова наилучшая практика для наименования этого объекта и / или работы с дизайном, который может или не может включать это имя или фразу в фактическую реализацию?

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

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

Теперь у нас есть возможность назвать наш репозиторий как TimeLog, что больше соответствует концепции универсального языка DDD, или мы могли бы назвать его TimeLogEntryRepository, что кажется подходящим более общее соглашение об именовании репозиториев после совокупного корня, который они запрашивают / сохраняют. Я больше склоняюсь к идее использования TimeLog, поскольку он лучше описывает реальную роль, которую он играет в модели предметной области, что, в свою очередь, должно помочь в передаче дизайна экспертам предметной области. С другой стороны, выбор использования TimeLogEntryRepository следует существующим соглашениям DDD и, таким образом, упростит разработку дизайна для разработчиков. Компромисс также может заключаться в именовании TimeLog, но при условии, что все репозитории будут реализовывать интерфейс IRepository или унаследовать от общего базового класса Repository, чтобы помочь разработчикам находить и отличать классы репозитория от других, составляющих модель предметной области. Основная проблема, которую я испытываю при использовании базового класса, заключается в том, что он может поощрять использование интерфейсов маркеров или слабого ненужного базового класса только для целей организации, а не из-за поведенческих факторов.

Что лучше всего делать в таких случаях? Я вижу, что проблема того же типа, возможно, возникает для служб, поскольку они являются еще одной частью типичных строительных блоков DDD, которые разработчики обычно называют суффиксом «Служба», например, в SomeComplexActivityService, но для Entities и Value Objects это действительно не проблема. . Мне особенно интересно узнать, что могут сказать другие, у которых за плечами больше опыта DDD.


person jpierson    schedule 03.05.2011    source источник


Ответы (2)


Я лично предпочитаю TimeLog.

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

То же самое и со службами - вместо ApplicationRegistrationService я использую ApplicationRegistrator.

Вот неплохая статья о репозиториях.

person Arnis Lapsa    schedule 03.05.2011
comment
Я подумал, что слова «Регистратор» или «Реестр» могут иметь больше смысла, но после обращения к googlefight.com я был удивлен, увидев, что регистратор с большим отрывом берет пирог. googlefight.com/ - person jpierson; 03.05.2011
comment
+1, я прочитал статью, на которую вы указали ссылку, и оказалось, что они представляют собой аккуратный свободный интерфейс, созданный для самих репозиториев, что довольно удобно. Не уверен, что захочу заходить так далеко, но я вижу, где в этом есть свои преимущества. - person jpierson; 17.05.2011

Я второе предложение @Arnis L. Я бы также добавил, что в отношении DDD ваш домен должен отражать фактический UL (повсеместный язык), которым вы делитесь с бизнес-аналитиком и другими людьми, которые часто не являются техническими людьми. Так что я думаю, что вы поговорите с ними о TimeLog, а не о TimeLogEntryRepository. Репозиторий - это просто шаблон, и его имя не должно быть в соглашениях об именах.

person Tomasz Jaskuλa    schedule 16.04.2012
comment
Я согласен. Вы не называете вещи в домене. Остальные делают. Если они называют это TimeLog, то это TimeLog. Что такое моделирование? Представляя реальность. Они называют это TimeLog, моделируйте его как TimeLog. Вместо этого TimeLogEntryRepository создает (ложную?) Реальность, а не моделирует ее. DDD - это открытие реальности в сознании экспертов. Не навязывать технические вещи бизнесу. Боковой комментарий: я изучаю (пока нет выводов), чтобы использовать цвета в диаграммах классов. Все репозитории будут иметь цвет X, а затем TimeLog будет именно этого цвета. - person Xavi Montero; 28.04.2016
comment
@XaviMontero проблема в том, что на языке домена нет таких вещей, как служба и репозиторий. но интерфейсы служб и репозиториев существуют внутри модели предметной области, а сервисы объявляют методы, которые представляют некоторые концепции предметной области (в то время как репозитории нет) - person whyer; 06.02.2021