Value Object по Эвансу
- ·
-
Value Object — это один из ключевых концептов в DDD, который представляет собой объект, который описывает некоторое значение или состояние, но не имеет идентичности. Value Object не является сущностью, поскольку не имеет уникального идентификатора, и не может быть изменен после создания.
В PHP Value Object может быть реализован как класс, который содержит только свойства и методы для получения и установки значений свойств. Вот пример класса Value Object на PHP:
class Money {
private $amount;
private $currency;
public function __construct($amount, $currency) {
$this->amount = $amount;
$this->currency = $currency;
}
public function getAmount() {
return $this->amount;
}
public function getCurrency() {
return $this->currency;
}
}
В этом примере мы создали класс Money, который представляет собой Value Object для денежных сумм. Класс содержит два приватных свойства: $amount и $currency, и два публичных метода: getAmount() и getCurrency(), которые возвращают значения этих свойств.
Заметьте, что класс Money не имеет методов для изменения значений свойств, потому что Value Object не может быть изменен после создания.
Теперь рассмотрим пример использования Value Object в контексте DDD на PHP. Допустим, у нас есть приложение для управления задачами, и мы хотим использовать Value Object для описания статуса задачи.
class TaskStatus {
const TODO = 'todo';
const IN_PROGRESS = 'in_progress';
const DONE = 'done';
private $status;
public function __construct($status) {
if (!in_array($status, [self::TODO, self::IN_PROGRESS, self::DONE])) {
throw new InvalidArgumentException('Invalid task status');
}
$this->status = $status;
}
public function getStatus() {
return $this->status;
}
}
В этом примере мы создали класс TaskStatus, который представляет собой Value Object для статуса задачи. Класс содержит три константы: TODO, IN_PROGRESS и DONE, которые представляют возможные значения статуса задачи. Класс также содержит одно приватное свойство: $status, и один публичный метод: getStatus(), который возвращает значение этого свойства.
Заметьте, что мы добавили проверку в конструкторе, чтобы убедиться, что переданное значение является допустимым значением статуса задачи.
Теперь мы можем использовать класс TaskStatus в нашем приложении для управления задачами:
class Task {
private $id;
private $name;
private $status;
public function __construct($id, $name, TaskStatus $status) {
$this->id = $id;
$this->name = $name;
$this->status = $status;
}
public function getStatus() {
return $this->status;
}
public function updateStatus(TaskStatus $status) {
$this->status = $status;
// Отправляем событие обновления статуса задачи
$event = new TaskStatusUpdatedEvent($this->id, $status);
EventDispatcher::dispatch($event);
}
}
class TaskStatusUpdatedEvent {
private $taskId;
private $status;
public function __construct($taskId, TaskStatus $status) {
$this->taskId = $taskId;
$this->status = $status;
}
public function getTaskId() {
return $this->taskId;
}
public function getStatus() {
return $this->status;
}
}
В этом примере мы создали класс Task, который представляет собой сущность для задачи. Класс содержит три приватных свойства: $id, $name и $status, и два публичных метода: getStatus() и updateStatus(), которые позволяют получать и изменять статус задачи соответственно.
Мы также создали класс TaskStatusUpdatedEvent, который представляет собой событие обновления статуса задачи. Класс содержит два приватных свойства: $taskId и $status, и два публичных метода: getTaskId() и getStatus(), которые позволяют получать значения этих свойств.
Заметьте, что мы использовали Value Object TaskStatus для представления статуса задачи в классе Task. Мы также использовали event-driven programming для обновления статуса задачи и отправки события обновления статуса задачи.
Value Object — это мощный инструмент в DDD, который позволяет описывать значения и состояния в приложении. В PHP Value Object может быть реализован как класс, который содержит только свойства и методы для получения и установки значений свойств. Value Object не может быть изменен после создания, что делает его более надежным и безопасным.