По пунктам: 1. Существует бекенд, в котором сервисы Calculator и PartnerService зависят друг от друга неявным образом через сервис ContractService. То есть в изображенной структуре все зависят ото всех и изменения в любом из компонентов прямо или косвенно оказывает влияение на все 5 компонентов. 2. Посредством моделирования (этот процесс за скобками, можно использовать классический DDD, можно Event Storming, можно Domain Storytelling, да даже исходя из Business Capabilities) были определены границы и эти границы наложены на существующее решение. Мы видим на изображении, что Contract, Partner и ContractService по текущей внутренней реализации одновременно востребован и в контексте Sales и в контексте Risk Assessment. 3. Здесь изображеная целевая картинка, как может выглядеть декомпозиция. В Sales остается ContractService, в Risk Assessment остается PartnerService. Но остается вопрос: «а что делать с общей сущностью?». И ответ далеко не очевиден, потому что если посмотреть только на данные, то вроде как они нужны и там и там. Проблема в том, что зачастую в самих данных, в самих атрибутах нет метаданных об использовании этих атрибутов в тех или иных бизнес-операциях, контекстах, бизнес-процессах. Эту информацию приходится воссоздавать, чтобы определить какие данные в каком контексте какой смысл несут. Это важнейший аспект и как раз его нарушение ведет к появлению тех самых распределенных монолитов.
Как с этим быть? 4. В рамках моделирования и определения Ubiquitous Language (по сути языка, в котором каждый термин имеет однозначеное значение в заданной границе) мы выясняем, что в контексте Risk Assessment нет понятия signContract(), соответственно в этом контексте нет и термина для атрибута signatureDate. При этом исследуя Sales мы видим, что в этом контексте, контексте Продаж, нет понятия voteContract и в нем не определены термины ceditRating и votingResult. То есть здесь явным образом в одном сервисе и в одной сущности смешаны понятия из двух разных моделей. Негативное следствие этого – увеличение общей сложности, зависимости, размытие ответственности, ну и как следствие – подобная реализация сдерживает развитие каждой модели в отдельности. Что с этим делать?
Есть два варианта, безопасный именее безопасный.
Безопасный показан на изображении: 5. Мы явно в рамках существующего сервиса делаем дубликат сущности Contract и сервиса ContractService и проводим рефакторинг внутри существующего сервиса. Например, это могут быть разные пакеты со своими интерфейсами. 6. В каждом из пакетов мы вычищаем то, что не относится к конкретному контексту, то есть проводим рефакторинг. Рефакторинг это ровно потому, что поведение не меняется, меняется только структура. 7. Получаем в рамках все того же монолита два пакетета, в рамках каждого из которых только сущности и методы, имеющие смысл в рамках определенного контекста.
Теперь о неточностях в изображении. Возможно автор поторопился и есть нюанс, который вызывает вопросы, а именно, то, что на изображении (3) отсутствует сервис ContractService, хотя на последущих слайдах он указывает, что такой сервис существует. Это нисколько не меняет сути описанного подхода. Можно мысленно представить, что на изображении (3) есть еще один сервис ContractService, смысл не меняется совершенно, так как смысл ровно в том, каким образом разорвать зависимость.
Менее безопасный вариант: Мы сразу выносим физически сервис ContractService в отдельный контекст, теперь у нас по инстансу ContractService в Sales и Risk Assessment, и проводим рефакторинг двух сервисов параллельно.
По пунктам: 1. Существует бекенд, в котором сервисы Calculator и PartnerService зависят друг от друга неявным образом через сервис ContractService. То есть в изображенной структуре все зависят ото всех и изменения в любом из компонентов прямо или косвенно оказывает влияение на все 5 компонентов. 2. Посредством моделирования (этот процесс за скобками, можно использовать классический DDD, можно Event Storming, можно Domain Storytelling, да даже исходя из Business Capabilities) были определены границы и эти границы наложены на существующее решение. Мы видим на изображении, что Contract, Partner и ContractService по текущей внутренней реализации одновременно востребован и в контексте Sales и в контексте Risk Assessment. 3. Здесь изображеная целевая картинка, как может выглядеть декомпозиция. В Sales остается ContractService, в Risk Assessment остается PartnerService. Но остается вопрос: «а что делать с общей сущностью?». И ответ далеко не очевиден, потому что если посмотреть только на данные, то вроде как они нужны и там и там. Проблема в том, что зачастую в самих данных, в самих атрибутах нет метаданных об использовании этих атрибутов в тех или иных бизнес-операциях, контекстах, бизнес-процессах. Эту информацию приходится воссоздавать, чтобы определить какие данные в каком контексте какой смысл несут. Это важнейший аспект и как раз его нарушение ведет к появлению тех самых распределенных монолитов.
Как с этим быть? 4. В рамках моделирования и определения Ubiquitous Language (по сути языка, в котором каждый термин имеет однозначеное значение в заданной границе) мы выясняем, что в контексте Risk Assessment нет понятия signContract(), соответственно в этом контексте нет и термина для атрибута signatureDate. При этом исследуя Sales мы видим, что в этом контексте, контексте Продаж, нет понятия voteContract и в нем не определены термины ceditRating и votingResult. То есть здесь явным образом в одном сервисе и в одной сущности смешаны понятия из двух разных моделей. Негативное следствие этого – увеличение общей сложности, зависимости, размытие ответственности, ну и как следствие – подобная реализация сдерживает развитие каждой модели в отдельности. Что с этим делать?
Есть два варианта, безопасный именее безопасный.
Безопасный показан на изображении: 5. Мы явно в рамках существующего сервиса делаем дубликат сущности Contract и сервиса ContractService и проводим рефакторинг внутри существующего сервиса. Например, это могут быть разные пакеты со своими интерфейсами. 6. В каждом из пакетов мы вычищаем то, что не относится к конкретному контексту, то есть проводим рефакторинг. Рефакторинг это ровно потому, что поведение не меняется, меняется только структура. 7. Получаем в рамках все того же монолита два пакетета, в рамках каждого из которых только сущности и методы, имеющие смысл в рамках определенного контекста.
Теперь о неточностях в изображении. Возможно автор поторопился и есть нюанс, который вызывает вопросы, а именно, то, что на изображении (3) отсутствует сервис ContractService, хотя на последущих слайдах он указывает, что такой сервис существует. Это нисколько не меняет сути описанного подхода. Можно мысленно представить, что на изображении (3) есть еще один сервис ContractService, смысл не меняется совершенно, так как смысл ровно в том, каким образом разорвать зависимость.
Менее безопасный вариант: Мы сразу выносим физически сервис ContractService в отдельный контекст, теперь у нас по инстансу ContractService в Sales и Risk Assessment, и проводим рефакторинг двух сервисов параллельно.
Activate up to 20 bots The channel also called on people to turn out for illegal assemblies and listed the things that participants should bring along with them, showing prior planning was in the works for riots. The messages also incited people to hurl toxic gas bombs at police and MTR stations, he added. fire bomb molotov November 18 Dylan Hollingsworth yau ma tei The group’s featured image is of a Pepe frog yelling, often referred to as the “REEEEEEE” meme. Pepe the Frog was created back in 2005 by Matt Furie and has since become an internet symbol for meme culture and “degen” culture. The creator of the channel becomes its administrator by default. If you need help managing your channel, you can add more administrators from your subscriber base. You can provide each admin with limited or full rights to manage the channel. For example, you can allow an administrator to publish and edit content while withholding the right to add new subscribers.
from us