Объекты-значения — это важный шаблон проектирования в DDD, представляющий объекты, равенство которых определяется значениями их атрибутов, а не идентификаторами.

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

Поля частных структур

Объявите свои объекты-значения как структуры Go и инкапсулируйте поля объекта-значения, начав их имена со строчной буквы.

Это ограничивает прямой доступ к полям извне пакета, предотвращая внешние модификации.

type Point struct {
 x, y int
}

Нет методов установки

Избегайте определения методов установки для полей вашего объекта значения. Потому что это сделает ваш объект значения изменяемым.

Необязательные методы получения

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

func (p Point) X() int {
 return p.x
}

func (p Point) Y() int {
 return p.y
}

Чистые функции

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

func (p Point) Plus(other Point) Point {
 return Point{x: p.x + other.x, y: p.y + other.y}
}

Следуя этим рекомендациям, вы можете быть уверены в неизменности ваших объектов-значений в Golang.