Domain Driven Design: принципы и приемы

Domain-driven design (DDD) – это подход к проектированию программных систем, который сосредотачивается на моделировании сферы деятельности и ее бизнес-правилах. Основная идея DDD заключается в том, что проектирование информационной системы должно соответствовать бизнес-определениям и терминологии.

DDD предлагает использоватьуниверсальный язык (UL) для описания всей логики бизнеса. На этапе анализа и проектирования,бизнес-правила и определения будут выражены на UL, который потом будет использоваться в реализации информационной системы. Таким образом, разработчики и представители бизнеса будут использовать одинаковые термины, что поможет в избежании путаницы и затруднений на следующих этапах.

В DDD используется паттерн объектной модели (POCO), который позволяет создавать объекты бизнес-модели без привязки к конкретной платформы или технологии. Это позволяет возможность переносить объекты модели на другую платформу и использовать их повторно в разных системах.

Вот пример класса языка C# для представления объекта задачи (task):


public class Task 
{
   public int Id { get; set; }
   public string Description { get; set; }
   public DateTime CreatedAt { get; private set; } = DateTime.Now;
   public DateTime? DueDate { get; set; }
   public Status Status { get; set; }
   
   private readonly List _notes = new List();
   public IReadOnlyList Notes => _notes.AsReadOnly();
  
   public void AddNote(string message)
   {
      _notes.Add(new Note(message));
   }
   
   public void Close()
   {
      if (DueDate < DateTime.Today) {
         throw new ArgumentException("The task cannot be closed because the due date has passed");
      }
      Status = Status.Closed;
   }
}
public class Note
{
    public Note(string message)
    {
        Message = message;
    }
    public string Message { get; }
    public DateTime CreatedAt { get; } = DateTime.Now;
}

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

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

Например, следующий класс C# показывает граничный объект для управления задачами, который включает в себя репозиторий, который используется для сохранения и загрузки данных задачи:


public class TaskManager
{
   private readonly ITaskRepository _taskRepository;
   private readonly IUnitOfWork _unitOfWork;
   
   public TaskManager(ITaskRepository taskRepository, IUnitOfWork unitOfWork)
   {
      _taskRepository = taskRepository;
      _unitOfWork = unitOfWork;
   }
   
   // создание новой задачи 
   public void CreateTask(string description)
   {
      var task = new Task
      {
         Description = description,
         Status = Status.Open
      };
      _taskRepository.Add(task);
      _unitOfWork.Commit();
   }
   
   // Получение всех задач 
   public IEnumerable< Task> GetAllTasks()
   {
      return _taskRepository.GetAll();
   }
   
   // Получение задачи по ее идентификатору 
   public Task GetTaskById(int taskId)
   {
      return _taskRepository.GetById(taskId);
   }
   
   // Закрыть задачу 
   public void CloseTask(int taskId)
   {
      var task = _taskRepository.GetById(taskId);
      task.Close();
      _unitOfWork.Commit();
   }
   
   // Добавить заметку в задачу 
   public void AddNoteToTask(int taskId, string message)
   {
      var task = _taskRepository.GetById(taskId);
      task.AddNote(message);
      _unitOfWork.Commit();
   }
}

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

В итоге, DDD предлагает использовать объекто-ориентированные методы и логику для моделирования бизнес-логики в программной системе, используя универсальный язык для унификации терминологии между отделами различных компаний. Это помогает сократить трудности связанные с разной терминологии и пониманиями в бизнесе и разработке.

Похожие вопросы на: "domain driven design "

Hex: Изучение использования цветов в графическом дизайне
Работа с длиной строки в JavaScript: метод length
Абстрактный класс C: определение и использование
Инструмент для визуализации данных - vstack
Андерстат - инструмент для анализа и оптимизации SEO
ROC AUC Score: Understanding its Role in Machine Learning Models
JS Charts - создание красивых и интерактивных диаграмм и графиков
Python градиентный спуск: применение и примеры реализации
Парсер на Python: эффективный способ получения данных с веб-страниц
Passport JS: надежная защита ваших данных