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 предлагает использовать объекто-ориентированные методы и логику для моделирования бизнес-логики в программной системе, используя универсальный язык для унификации терминологии между отделами различных компаний. Это помогает сократить трудности связанные с разной терминологии и пониманиями в бизнесе и разработке.