> Что такое DDD (Node.js, JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: Mosline
Стек: Node.js, JavaScript
> Пример ответа
Короткий ответ
DDD (Domain-Driven Design) - это подход к проектированию ПО, где основное внимание уделяется предметной области (domain) и её логике. Код строится вокруг бизнес-сущностей и правил, а не технических деталей. Для frontend DDD помогает организовать сложную бизнес-логику на клиенте, например, в формах или валидации, используя такие концепции как entity, value object и domain service.
Подробное объяснение
DDD (Domain-Driven Design) - это методология, предложенная Эриком Эвансом, которая фокусируется на моделировании программного обеспечения в соответствии с реальными бизнес-процессами. Основная идея - сделать код отражением предметной области, а не технической инфраструктуры.
Ключевые концепции DDD:
- Entity - объект с уникальным идентификатором и изменяемым состоянием (например, пользователь, заказ).
- Value Object - неизменяемый объект, определяемый своими атрибутами (например, адрес, деньги).
- Aggregate - группа связанных сущностей, обрабатываемая как единое целое.
- Domain Service - сервис, содержащий бизнес-логику, не привязанную к конкретной сущности.
- Repository - абстракция для доступа к данным (на frontend может быть заменён API-клиентом).
- Ubiquitous Language - единый язык между разработчиками и бизнесом, используемый в коде и обсуждениях.
Для frontend DDD особенно полезен в сложных приложениях с богатой бизнес-логикой (например, редакторы, системы управления контентом, финансовые дашборды). Он помогает отделить бизнес-правила от UI-логики и инфраструктуры (запросы к API, работа с localStorage).
На практике
На практике DDD на frontend реализуется через чёткое разделение слоёв:
- Domain layer - бизнес-сущности и правила (например, класс
Orderс методамиcalculateTotalиvalidateItems). - Application layer - use cases (например,
PlaceOrderUseCase, который вызывает методы домена и отправляет данные). - Infrastructure layer - работа с API, localStorage, внешними библиотеками.
- UI layer - React-компоненты, которые только отображают данные и вызывают use cases.
Пример организации папок:
src/ domain/ entities/ Order.js value-objects/ Money.js services/ DiscountService.js application/ use-cases/ PlaceOrderUseCase.js infrastructure/ api/ orderApi.js ui/ components/ OrderForm.jsx
DDD не требует строгого следования всем паттернам - достаточно начать с выделения бизнес-логики в отдельные классы и использования ubiquitous language.
Пример кода
JAVASCRIPT// domain/entities/Order.jsclass Order {constructor(id, items, discount) {this.id = id;this.items = items; // массив Value Objectthis.discount = discount; // Value Object}calculateTotal() {const subtotal = this.items.reduce((sum, item) => sum + item.price, 0);return this.discount.apply(subtotal);}validateItems() {return this.items.every(item => item.isValid());}}// domain/value-objects/Money.jsclass Money {constructor(amount, currency = 'USD') {this.amount = amount;this.currency = currency;Object.freeze(this);}add(other) {if (other.currency !== this.currency) throw new Error('Currency mismatch');return new Money(this.amount + other.amount, this.currency);}}// application/use-cases/PlaceOrderUseCase.jsclass PlaceOrderUseCase {constructor(orderRepository, paymentService) {this.orderRepository = orderRepository;this.paymentService = paymentService;}execute(orderData) {const order = new Order(orderData.id,orderData.items.map(item => new Money(item.price)),new Discount(orderData.discount));if (!order.validateItems()) throw new Error('Invalid items');this.paymentService.charge(order.calculateTotal());this.orderRepository.save(order);}}
Как отвечать на собеседовании
Для junior-позиции достаточно показать понимание базовых идей DDD и его применимости на frontend. Начни с краткого определения, затем приведи пример из своей практики (например, как ты выделил бизнес-логику валидации формы в отдельный класс). Упомяни, что DDD помогает избежать "god objects" и делает код тестируемым. Если спросят про сложности, скажи, что на frontend не всегда нужно строго следовать DDD - достаточно применять его элементы в сложных модулях.
Что проверяет интервьюер
Интервьюер проверяет:
- Понимание разницы между технической и бизнес-логикой.
- Умение применять DDD-концепции (entity, value object) в контексте frontend.
- Осознание, что DDD - это не серебряная пуля, а инструмент для сложных доменов.
- Способность объяснить, как DDD улучшает поддерживаемость кода.
Типичные ошибки
- Путать DDD с архитектурными паттернами (например, чистая архитектура) - DDD это про моделирование домена, а не про слои.
- Думать, что DDD нужен только на backend - на frontend он так же полезен для сложной логики.
- Переусложнять код, создавая entity для каждой мелочи (например, для простого списка задач).
- Игнорировать ubiquitous language - использовать технические термины вместо бизнес-терминов в коде.
> Похожие задачи по frontend
Какая библиотека для IoC контейнера использовалась
Насколько жестко проект был разделен на ограниченные контексты и агрегаты в DDD
Какие приоритеты при выборе вакансии
Какие способы оптимизации time to first byte существуют
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью