Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Понятие и применение Модели и моделирования в программировании с примерами на JavaScript и PHP, DDD

Лекция



Привет, Вы узнаете о том , что такое модель в программировании, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое модель в программировании, моделирование в программировании , настоятельно рекомендую прочитать все из категории Моделирование информационных систем.

модель в программировании и DDD — это абстракция, описывающая предметную область, ее данные и поведение. В DDD модель — центральный элемент, отражающий бизнес-логику.

Вот подробное объяснение с примерами на JavaScript и PHP:

Модель в программировании — это абстрактное представление реального объекта, процесса или системы, созданное для удобства разработки, анализа и работы с данными.

Проще говоря, модель — это способ описать что-то из реального мира так, чтобы с этим могла работать программа.

Понятие и применение Модели  и моделирования в программировании  с примерами на JavaScript  и PHP, DDD

Что такое модель в программировании

В общем смысле модель — это структура, которая описывает данные и операции над ними. Она может быть частью архитектурных паттернов, таких как MVC (Model-View-Controller), где модель отвечает за:

  • хранение данных,

  • бизнес-логику,

  • взаимодействие с базой данных.

В DDD термин модель имеет особый смысл:

Модель = формализованное представление предметной области в коде.

Поэтому:

  • Entity

  • Value Object

  • Aggregate

  • Domain Service

  • Domain Event

— все это элементы доменной модели (domain model).
То есть они составляют модель предметной области, но сами по себе не являются “моделями ORM” или “Model из MVC”.

Где используется понятие «модель»

Область Что означает модель
ООП (объектно-ориентированное программирование) Класс или объект, описывающий сущность (например, User, Car, Order)
MVC, MVVM и другие архитектуры Часть программы, отвечающая за данные и логику работы с ними
Машинное обучение Алгоритм, обученный на данных, который может делать прогнозы
Базы данных Структура хранения данных (таблицы, связи, схемы)
Бизнес-аналитика Описание процессов, сущностей и их правил

Зачем нужны модели

  • Упрощают работу с данными

  • Позволяют структурировать код

  • Делают программу понятной и расширяемой

  • Помогают тестировать и поддерживать проект

Коротко

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

Не следует путать модель в программировании с моделированием — это разные понятия, хотя звучат похоже.

Модель (model)

Что это:
Структура данных и логика, которая описывает объект или сущность из реального мира в программе.

Пример:
Класс Car с полями model, year, speed и методами drive(), stop() — это модель автомобиля в коде.

В DDD (Domain-Driven Design) модель — это не просто набор классов, а отражение предметной области в коде, согласованное с тем, как о ней думают и говорят эксперты домена.

Если коротко:
модель = знания о бизнес-области + правила + поведение, выраженные в коде.

Что включает в себя модель в DDD

Сущности (Entities)

Объекты с идентичностью, которая важнее их текущих данных.

Признаки:

  • есть id

  • состояние может меняться

  • остается «тем же самым» объектом

Пример:

User 
Order 
Account 
Character (в игре)

Где используется:

  • ООП (классы и объекты)

  • MVC/MVVM архитектуры (model — данные)

  • Базы данных (таблицы и связи)

  • Игровая логика (модель игрока, врага и т.д.)

Моделирование (modeling / simulation)

Что это:
Процесс создания и изучения модели поведения системы — попытка воспроизвести реальный процесс или явление.

Пример:
Симуляция движения автомобилей в городе: пробки, светофоры, поведение водителей — это моделирование транспортной системы.

Где используется:

  • Научные симуляции (физика, биология, экономика)

  • Игровая физика

  • Машинное обучение (построение вычислительных моделей)

  • 3D моделирование (создание объектов для графики)

Коротко

Термин Описание Пример
Модель Представление объекта в программе Класс Car
Моделирование Процесс создания динамической симуляции Симуляция движения машин в городе

Формула запоминания

Модель — что описано.
Моделирование — как ведет себя и что происходит с моделью во времени.

Разница между моделью и классом тонкая, но важная.

Класс

Что это:
Шаблон (чертеж) для создания объектов в ООП.
Определяет структуру (поля) и поведение (методы).

Класс — это технический механизм языка программирования.

Пример:

class Car: 
def __init__(self, brand, year): 
   self.brand = brand 
   self.year = year 

def drive(self): 
    print("Driving")

Класс Car можно использовать как угодно — в качестве модели, утилиты, части бизнес-логики и т.п.

Модель

Что это:
Логическая концепция предметной области, представление реального объекта в программе.

Модель — это идея и смысл, описывающий сущность (User, Order, Product, Enemy, Player).

Модель чаще всего реализуется классом, но не обязана им быть
(например, модель данных может быть и в виде таблицы в БД или структуры JSON).

Головное правило

Класс = инструмент (форма) 
Модель = смысл (содержание) 

Модель отвечает на вопрос: что это в реальном мире?
Класс отвечает на вопрос: как это реализовано в коде?

Пример различия

Модель Класс
Идея Игрок в игре class Player
Смысл Характеристики и логика игрока Поля hp, speed, методы jump()
Область Доменная логика Кодовая структура

Еще проще

Модель — это концепция.
Класс — ее программная реализация.

Пример из Unity (так как вы работаете с Unity 2022)

  • Модель игрока — это данные и правила: здоровье, скорость, инвентарь, урон.

  • Класс PlayerController — это компонент с кодом на C#, который реализует эту модель.

Пример на PHP (MVC):

php
class Product {
    public $name;
    public $price;

    public function __construct($name, $price) {
        $this->name = $name;
        $this->price = $price;
    }

    public function applyDiscount($percent) {
        $this->price -= $this->price * ($percent / 100);
    }
}

Пример на JavaScript (MVC):

javascript
class Product {
  constructor(name, price) {
    this.name = name;
    this.price = price;
  }

  applyDiscount(percent) {
    this.price -= this.price * (percent / 100);
  }
}

Модель в Domain-Driven Design (DDD)

В DDD модель — это не просто структура данных, а отражение бизнес-реальности. Об этом говорит сайт https://intellect.icu . Она включает:

  • Сущности (Entities) — объекты с уникальной идентичностью.

  • Значения (Value Objects) — объекты без идентичности, определяемые по значению.

  • Агрегаты (Aggregates) — группы связанных сущностей.

  • Сервисы домена — операции, не принадлежащие конкретной сущности.

Пример на JavaScript (DDD):

javascript
class Order {
  constructor(id, items) {
    this.id = id;
    this.items = items;
  }

  getTotal() {
    return this.items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  }
}

class Item {
  constructor(name, price, quantity) {
    this.name = name;
    this.price = price;
    this.quantity = quantity;
  }
}

Пример на PHP (DDD):

class Order {
    private $id;
    private $items = [];

    public function __construct($id) {
        $this->id = $id;
    }

    public function addItem(Item $item) {
        $this->items[] = $item;
    }

    public function getTotal() {
        $total = 0;
        foreach ($this->items as $item) {
            $total += $item->getPrice() * $item->getQuantity();
        }
        return $total;
    }
}

class Item {
    private $name;
    private $price;
    private $quantity;

    public function __construct($name, $price, $quantity) {
        $this->name = $name;
        $this->price = $price;
        $this->quantity = $quantity;
    }

    public function getPrice() {
        return $this->price;
    }

    public function getQuantity() {
        return $this->quantity;
    }
}

Применение модели в DDD

  • Фокус на бизнес-логике, а не на технической реализации.

  • Единый язык между разработчиками и бизнесом.

  • Разделение ответственности: модель не зависит от UI или базы данных.

  • Упрощение сложных систем через агрегацию и контексты.

Что включает в себя модель в DDD кроме самой модели

1. Value Objects

Объекты без идентичности, определяются только значением.

Признаки:

  • неизменяемые

  • сравниваются по значениям

  • не живут сами по себе

Пример:

Money (amount + currency) 
Email 
Coordinates 
Damage 

2. Агрегаты и Aggregate Root

Группа связанных объектов, которые изменяются только через корень агрегата.

Пример:

Order (Aggregate Root) 
├─ OrderItem 
├─ DeliveryAddress (Value Object) 

Правило:

снаружи можно работать только с Aggregate Root

3. Доменные сервисы (Domain Services)

Логика домена, которая не принадлежит одной сущности.

Пример:

DamageCalculator
PaymentPolicy
MatchmakingService 

4. Доменные события (Domain Events)

Факты, которые уже произошли в домене.

Пример:

OrderPaid UserRegistered BossDefeated 

Что НЕ является моделью в DDD

DTO
ORM-модели как «мешки с полями»
Контроллеры
Репозитории (они обслуживают модель, но не входят в нее)

Главное отличие от «обычного ООП»

ООП без DDD DDD
Данные + геттеры Поведение и правила внутри модели
Бизнес-логика в сервисах Бизнес-логика в домене
Технические имена Ubiquitous Language Вездесущий язык

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

В Domain-Driven Design (DDD) модель — это не просто набор классов с методами. Она — отражение бизнес-реальности, и с ней можно делать гораздо больше, чем просто вызывать ее собственные методы. Вот что можно делать с моделью вне ее внутренней логики:

Что можно делать с моделью в DDD, кроме ее собственных методов

1. Интеграция с другими моделями

  • Связывать модель с другими агрегатами через доменные события или сервисы.

  • Пример: заказ (Order) может инициировать создание счета (Invoice) через доменный сервис.

2. Валидация и инварианты

  • Проверять модель на соответствие бизнес-правилам.

  • Пример: проверка, что сумма заказа не превышает лимит клиента.

3. Использование в доменных сервисах

  • Вынесение операций, не принадлежащих конкретной сущности, в отдельные сервисы.

  • Пример: расчет скидки по сложной формуле, зависящей от внешних факторов.

4. Сериализация и хранение

  • Преобразование модели в JSON, XML, SQL и другие форматы для хранения или передачи.

  • Пример: сохранение заказа в базе данных или отправка по API.

5. Отслеживание изменений (Audit / Event Sourcing)

  • Запись изменений модели в виде событий.

  • Пример: логирование каждого изменения статуса заказа.

6. Проверка бизнес-правил через спецификации

  • Использование паттерна Specification для проверки условий.

  • Пример: IsEligibleForDiscountSpecification проверяет, подходит ли заказ для скидки.

7. Отображение в UI через DTO или ViewModel

  • Преобразование модели в удобный формат для отображения.

  • Пример: OrderViewModel показывает только нужные поля заказа.

8. Тестирование модели

  • Юнит-тесты, проверяющие поведение модели в разных сценариях.

  • Пример: тест, что метод applyDiscount() не дает отрицательной цены.

Пример: модель + доменный сервис на PHP

php
class OrdertService {
    public function calculate(Order $order): float {
        if ($order->getTotal() > 1000) {
            return $order->getTotal() * 0.1;
        }
        return 0;
    }

    public function save(Order $order): float {
... }
}

Пример: модель + сериализация на JS

javascript
const order = new Order(123, [new Item("Book", 20, 2)]);
const json = JSON.stringify(order); // можно отправить по API

моделирование в программировании

Моделирование в программировании — это процесс создания абстрактного представления реальной системы или процесса, чтобы понимать, анализировать, прогнозировать или воспроизводить поведение этой системы.

Или если проще: мы создаем модель, чтобы проверить идею, изучить поведение или спроектировать систему до ее реальной реализации.

Основные цели моделирования

  • Понимание системы
    Разобраться, как что-то работает.

  • Прогнозирование
    Узнать, как система будет вести себя при определенных условиях.

  • Оптимизация
    Найти лучший способ построить систему или решить задачу.

  • Тестирование идей без риска
    Проверить гипотезу, не строя реальный объект.

Где используется моделирование в программировании

Область Пример
Бизнес-логика Модели процессов компании (BPMN, UML)
GameDev Физические модели, AI поведения персонажей
Машинное обучение Модели прогнозирования — нейросети
Системная архитектура Модели взаимодействия сервисов, ER-диаграммы
Научные симуляции Модели климата, биологических систем

Инструменты моделирования

  • UML диаграммы (классов, состояний, последовательностей)

  • SysML для сложных систем

  • ER-диаграммы для баз данных

  • Симуляторы (MATLAB, Simulink, Unity физика, PySim)

  • Алгоритмические модели (функции, структуры данных)

Алгоритмы компьютерного моделирования

  • Метод конечных элементов
  • Метод конечных разностей
  • Метод конечных объемов
  • Метод подвижных клеточных автоматов
  • Метод классической молекулярной динамики
  • Метод компонентных цепей
  • Метод узловых потенциалов

Важно не путать

Понятие Описание
Модель Конкретная структура данных/класс, который представляет сущность (например, User в программе)
Моделирование Процесс построения модели системы, ее логики и поведения

Модель — это результат.
Моделирование — это процесс создания модели.

Пример простой модели (программистской)

class Car: 
def __init__(self, speed, fuel):
   self.speed = speed 
   self.fuel = fuel 
def drive(self, distance): 
   self.fuel -= distance * 0.1 

Здесь Car — модель автомобиля.

Если же мы проектируем, как машина будет двигаться, какую физику использовать, как расходовать бензин — это уже моделирование.

Итог

  • Моделирование — это процесс проектирования и анализа системы

  • Модель — результат: абстракция, которую можно использовать в коде

  • Используется в планировании, анализе, симуляциях, проектировании архитектуры

Интересные вопросы

1. если по логике нужно использовать трансакции при сохранении в бд где их нужно использовать в моделе, в репозитории слое или на сервисном слое или еще гдето?

Ответы

1 Транзакции в DDD должны управляться на уровне Application Service (сервисного слоя), а не внутри доменной модели и не внутри отдельных репозиториев.

Почему именно сервисный слой

В DDD есть четкое разделение ответственности:

Слой Отвечает за
Domain Model бизнес-правила
Repository доступ к данным
Application Service orchestration (сценарий use-case + транзакции)

Транзакция — это технический механизм согласованности, а не бизнес-правило.
Поэтому ей не место в доменной модели.

Правильный поток выполнения

Типичный use-case в DDD:

Application Service 
├── открыть транзакцию 
├── получить агрегат из репозитория 
├── вызвать бизнес-метод агрегата 
├── сохранить агрегат через репозиторий 
└── закоммитить транзакцию 

Пример (псевдокод)

class OrderApplicationService
 { 
public function payOrder(OrderId $orderId, Money $amount) 
{ 
$this->transactionManager->begin(); 
try
 { 
$order = $this->orderRepository->getById($orderId);
 $order->pay($amount); // бизнес-логика в домене
 $this->orderRepository->save($order); 
$this->transactionManager->commit(); 
} catch (\Throwable $e) { 
$this->transactionManager->rollback();
 throw $e; 
} 
} 
} 

Почему нельзя делать транзакции в репозитории

Если транзакция внутри репозитория:

 saveOrder() 
 savePayment() 
 saveUser() 

то ты не сможешь гарантировать консистентность между несколькими агрегатами.

А в реальном use-case обычно:

изменяем несколько агрегатов 

значит транзакция должна охватывать весь use-case, а не одну операцию.

Почему нельзя делать транзакции в доменной модели

Домен:

  • не должен знать про БД

  • не должен знать про ORM

  • не должен знать про транзакции

Иначе это уже не чистая доменная модель.

А как же Domain Events?

Частый вопрос.

Правильная схема:

  1. доменная модель генерирует события

  2. они собираются в агрегате

  3. после commit транзакции — публикуются

Это обычно делается в Application Service или в infrastructure-слое.

Особый случай — один агрегат

Если use-case работает строго с одним агрегатом, то:

одна транзакция = один агрегат

Это идеальная ситуация в DDD (Aggregate boundary = transaction boundary).

Итог

Транзакции открываются в Application Service
Репозитории — не управляют транзакциями
Доменная модель — ничего не знает о транзакциях
Одна транзакция = один use-case

Ментальная модель

Запомнить можно так:

Application Service = режиссер сценария

он решает:

  • когда начать транзакцию

  • какие агрегаты загрузить

  • какие методы вызвать

  • когда сохранить

  • когда коммитить

Вау!! 😲 Ты еще не читал? Это зря!

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

Ответы на вопросы для самопроверки пишите в комментариях, мы проверим, или же задавайте свой вопрос по данной теме.

создано: 2025-10-31
обновлено: 2026-02-13
66



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:
Пожаловаться

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Моделирование информационных систем

Термины: Моделирование информационных систем