Domain, Context & Integration (DCI)

Относительно недавно на хабрахабре попалась статья Data Context Interaction (DCI) — эволюция объектно-ориентированной парадигмы, которая меня весьма заинтересовала описанным подходом, но примеры в ней были тупо скопированы с оригинальных публикаций 3х годичной давности или около того. Вообще все статьи по теме оперируют одним и тем же примером, который, на мой взгляд, не до конца раскрывает тему и все плюсы использования DCI. Но это общая проблема интернетов, даже уже говорить про это не хочется.

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

Для начала все же стоит привести немного теории, для тех, кому лень читать статью с хабра.

Проблема

Объектно-ориентированный подход проигрывает в отображении взаимодействия объектов. Для того чтобы показать что я имею ввиду, давайте взглянем на две системные операции (два
сценария использования) объектов из одной группы, взаимодействующих друг с другом.

На картинке показана системная операция четырех объектов, общающихся между собой. В данном случае Message это вызов метода или функции.

Рассмотрим второй возможный сценарий работы с теми же объектами:

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

Выше были представлены две системные операции выраженные в Use Case 1 и Use Case 2. Как мы их отображаем в коде? В идеальном случае, я бы хотел иметь возможность открыть один файл и понять модель взаимодействия объектов в сценарии использования, над которым я работаю. Если я работаю над Use Case 1, я ничего не хочу знать про Use Case 2. Вот что я считаю успешным отображением сценариев использования в коде.

На данный момент в гипотетическом коде, по которому построены UseCase может быть такое распределение методов.

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

Подробнее