Если сухо и коротко, то модель - это системное отображение оригинала.
Если формально, то https://sebokwiki.org/wiki/What_is_a_Model%3F
Модель - это прежде всего заменитель чего-либо (какого-то оригинала). Сидит клерк в банке и считает на калькуляторе процентную ставку по кредиту. Это оригинал.
Мы хотим этот расчёт автоматизировать. Для этого мы изучаем как он её считает. Получается модель предметной области, или аналитическая модель. Модель в problem space. Чтоб эту модель получить, нам нужно переработать существенную сложность.
Клерк (оригинал) выполняет много разных действий. Управляет автомобилем, поднимается на лифте, обедает в столовой, получает зарплату, подготавливает отчёты и рассчитывает процентную ставку обратившимся клиентам банка. Нас интересует только последнее. Это - решаемая моделью проблема. Это критически важный момент. Каждая модель имеет причину своего существования, для чего она создаётся. Для решения какой именно проблемы нам нужно заменить оригинал моделью? Это то, что подразумевается, но не называется явно в SRP, и поэтому он легко становится причиной любого безобразия.
Понимание того, какую проблему должна решить модель, даёт нам возможность определить релевантность аспектов оригинала решаемой проблеме.
У клерка есть водительские права - для расчета процентной ставки эта информация релевантна?
Кабинет клерка на 10 этаже. Эта информация релевантна когда мы называем его пассажиром лифта (отсюда, кстати, ключевая идея DDD об использовании лингвистических конфликтов для поиска моделей) и его нужно доставить на лифте на этот этаж. Но для расчёта ставки эта информация нерелевантна.
У клерка есть ставка ЦБР, которую он использует для расчета ставки банка. А вот это уже релевантно.
Релевантность позволяет упростить модель, устраняя из неё все нерелевантные аспекты оригинала. Это называется абстракция. Модель есть упрощение, а значит, модель есть абстракция.
Предположим, нам нужно проложить маршрут, например, из Москвы в Мурманск. Смогли бы мы это сделать по точной копии Земли в масштабе 1:1? Ни один человек не обладает такими когнитивными способностями, чтоб переварить такое количество нерелевантных деталей. Абстрагируясь от них мы создаём навигационную модель, которая содержит исключительно релевантные аспекты оригинала.
Итак. Модель есть упрощенная интерпретация оригинала с целью его замены для решения некой проблемы. Три важных момента:
1. Заменить что?
2. Заменить для чего?
3. Какие аспекты оригинала заменитель должен отображать?
Решаемая моделью проблема является причиной её создания. Это то, что должна делать модель, воплощённая автоматизированной системой. "Делать" на английском - "business". Поэтому логика модели называется business-logic.
Понимая логику работы клерка, мы начинаем готовить модель решения (solution space), чтоб воплотить её системой. В DDD ключевая суть заключается в том, чтоб аналитическая модель в problem space совпадала с моделью решения в solution space. Это коротко о том, что такое DDD.
Я, конечно, упростил и пропустил ряд важных моментов, таких как дихотомия функции и конструкции (подпереть дверь можно камнем, а можно и книгой). Чем отличается модуль от компонента и почему они могут не пересекаться (пример: ножницы из трёх модулей (две половинки и гвоздик) и двух компонентов (рокоятка и режущая кромка)). Как абстрактность слов приводит к лингвистическим конфликтам и позволяет обнаружить модели.
Все проблемы начинаются с того, что специалисты теряют понимание того, какие модели есть в системе и какие проблемы они решают. Теряется понимание релевантности. Модель начинает обрастать нерелевантными аспектами. Её границы расползаются и её аспекты переплетаются с аспектами других моделей. Возникает лапша. Теряется возможность рассмотреть фрагмент сложности изолировано в момент времени. Объем одномоментно рассматриваемой существенной сложности начинает превосходить когнитивные ограничения краткосрочной памяти человека. Возникают хаотичные изменения модели потому что никто уже не понимает как она работает.
Post #1887
1.17K