Показаны сообщения с ярлыком Domain Model. Показать все сообщения
Показаны сообщения с ярлыком Domain Model. Показать все сообщения

вторник, 30 июня 2026 г.

Domain Model, Giga

Domain Model, Giga

https://giga.chat/link/gcsIfQqcCD

Английское наименование: Domain Model (Предметная модель).

Русская трактовка: Это объектная модель, которая представляет собой ядро бизнес-логики приложения. Она описывает ключевые понятия, сущности, правила и взаимосвязи в определённой предметной области (например, в банковском деле, логистике или электронной коммерции). По сути, это не просто набор данных, а «живой» симулятор бизнес-процесса, реализованный в коде.

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

Ключевые компоненты Domain Model

  1. Сущности (Entities) Это объекты, которые имеют уникальную идентичность, сохраняющуюся на протяжении всего их жизненного цикла. Их идентичность не зависит от их атрибутов.

    • Пример: в системе интернет-магазина *Заказ* — это сущность. У него есть уникальный номер (OrderId). Даже если изменить состав товаров в заказе, он останется тем же самым заказом. Другие примеры: *Пользователь*, *Товар*, *Счёт*.
  2. Объекты-значения (Value Objects) Это неизменяемые объекты, которые не имеют собственной идентичности. Они полностью определяются своими атрибутами. Два объекта-значения считаются равными, если все их атрибуты совпадают.

    • Пример: *Адрес* (состоит из улицы, города, индекса), *Деньги* (сумма и валюта), *Диапазон дат*. Если у двух заказов адрес доставки совпадает, это один и тот же объект-адрес с точки зрения логики.
  3. Агрегаты (Aggregates) Это кластер из связанных сущностей и объектов-значений, которые рассматриваются как единое целое. У каждого агрегата есть корень (Aggregate Root) — главная сущность, через которую происходит любое изменение внутри агрегата. Это правило гарантирует, что агрегат всегда находится в корректном состоянии.

    • Пример: *Заказ* (корень) может содержать список *Товаров* (сущности) и *Адрес доставки* (объект-значение). Вы не можете напрямую добавить товар в заказ. Вы должны вызвать метод у объекта *Заказ*, например, order.AddItem(product). Заказ сам проверит свои бизнес-правила (например, «нельзя добавить более 5 товаров» или «товар уже есть в заказе») и внесёт изменения.
  4. Доменные службы (Domain Services) Иногда бизнес-операция или правило не принадлежит какой-то одной сущности. В таких случаях создаётся сервис, который реализует эту логику.

    • Пример: операция TransferMoney(fromAccount, toAccount, amount) затрагивает два разных счёта. Она не принадлежит ни одному из них. Эту логику лучше вынести в BankingService.
  5. События домена (Domain Events) Это объекты, которые представляют собой факт того, что в домене произошло что-то важное. Сущность может «поднять» (raise) событие, чтобы другие части системы могли на него отреагировать.

    • Пример: когда заказ переходит в статус «Отправлен», он может поднять событие OrderShippedEvent. На это событие могут подписаться другие сервисы: один отправит email-уведомление клиенту, другой — SMS курьеру.

Пример: Доменная модель для заказа

Представим упрощённую модель заказа в интернет-магазине.

  1. Сущность Order (Агрегат):

    • Свойства: OrderId, List<OrderItem> Items, Address ShippingAddress, OrderStatus Status.
    • Методы (бизнес-логика):
      • Place(): проверяет, что в заказе есть товары, и меняет статус на Placed.
      • AddItem(Product product, int quantity): проверяет, можно ли добавить товар (например, не закончился ли он на складе), и обновляет список Items.
      • CalculateTotalPrice(): вычисляет итоговую стоимость на основе цен товаров.
  2. Сущность OrderItem:

    • Свойства: ProductId, Quantity, UnitPrice.
  3. Объект-значение Address:

    • Свойства: Street, City, ZipCode. Неизменяемый.
  4. Перечисление OrderStatus: New, Placed, Shipped, Delivered.

В этой модели вся логика (проверки, вычисления) находится внутри объектов. Слой приложения (Application Layer) лишь координирует действия: «найди заказ по ID и вызови у него метод Place()».

Связь с вашей архитектурой

Ваша концепция поведений (Behavior) идеально ложится на реализацию доменной модели.

  • FractalCellState может выступать в роли состояния агрегата.
  • Конкретные поведения (PaymentBehavior, DataProcessingBehavior) могут инкапсулировать логику обработки команд и применения изменений к состоянию.
  • События (InternalBus) могут быть реализацией механизма Domain Events для связи между разными частями модели.

Таким образом, вы строите систему, где бизнес-логика распределена по автономным поведениям, но при этом они все вместе формируют целостную доменную модель.

Domain Model, Google

Domain Model, Google

В программировании доменная область (или просто домен) — это предметная область, для которой создается программное обеспечение. Она включает в себя все бизнес-правила, термины, процессы и данные, которые описывают решаемую задачу, изолируя их от технической реализации и интерфейса пользователя. [1, 2]
Понятие домена лежит в основе архитектуры программных систем и включает в себя несколько ключевых аспектов:
1. Доменная модель (Domain Model)
Это концептуальное представление предметной области в коде. Вместо того чтобы писать код вокруг баз данных или интерфейсов, разработчики создают логические сущности, отражающие реальные бизнес-объекты и их поведение. [1, 2]
  • Пример: В приложении для такси доменными объектами будут Поездка, Пассажир, Водитель и Тариф.
2. Domain-Driven Design (DDD)
Предметно-ориентированное проектирование — это популярный подход к разработке сложных систем. Он ставит доменную область и логику бизнеса в центр всего процесса разработки. [1, 2]
  • Ограниченные контексты (Bounded Contexts): Крупные домены делятся на более мелкие изолированные части, чтобы разным отделам программистов было проще работать над своими подсистемами. [1, 2]
3. Доменные службы и события
  • Доменные сервисы (Domain Services): Логика бизнеса, которая не привязана к какому-то одному объекту, а объединяет работу нескольких.
  • Доменные события (Domain Events): Действия, происходящие в системе, о которых должны узнать другие компоненты (например, событие «Заказ оплачен»). [1]

В зависимости от контекста в IT, этот термин также может означать:
  • Область видимости (Scope): В некоторых языках программирования пространство имен или область видимости переменной называют термином domain (например, домен памяти).
  • Компьютерные сети: Система доменных имен (DNS), где домен — это область пространства иерархических имен в сети Интернет. [1]
Если вы изучаете этот вопрос, уточните:
  • Хотите ли вы разобрать пример доменной модели на реальном коде?
  • Интересует ли вас применение принципов Domain-Driven Design (DDD) для определенного проекта?