TGViewer
dev notes dev notes @junsenior · 1.39K subscribers
Post #278 1.1K
Вчера я писал о первом совете из книги Go with Domains: стоит определять бизнес логику так, как она звучит.

Продолжаем знакомиться с этой книгой, и сегодня хочу написать про второе правило внедрения DDD в приложение: всегда держите валидное состояние в памяти в одном месте.

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

Возвращаясь к нашему примеру с тренажерным залом из вчерашнего поста, инкапсулируем домен Hour:


type Hour struct {
hour time.Time
availability Availability
}

// ...

func NewAvailableHour(hour time.Time) (*Hour, error) {
if err := validateTime(hour); err != nil {
return nil, err
}

return &Hour{
hour: hour,
availability: Available,
}, nil
}


Плохой пример использования этого домена, порождающий большое количество веток условий:


h := hour.NewAvailableHour("13:00")

if h.HasTrainingScheduled() {
h.SetState(hour.Available)
} else {
return some error
}


и хороший пример:


func (h *Hour) CancelTraining() error {
if !h.HasTrainingScheduled() {
return some error
}

h.availability. Available

return nil
}

h := hour.NewAvailableHour("13:00")
if err := h.CancelTraining(); err != nil {
return err
}


Вся работа с доменом - только в пакете с доменом, никакая логика по установке каких-либо состояний не выносится наружу.
  • 🔥 5
  • 👾 5
  • 👍 2
  • ❤ 1
More from @junsenior
  1. Sep 28, 2026Сошлись две вещи. Первая - мой проект safemap.ai, про который я уже писал выше - интеракти…
  2. Sep 17, 2026Post #356
  3. Sep 15, 2026Увидел тут в x.com статистику вакансий по PHP и статистику вакансий по hh.ru в целом. Я на…
  4. Sep 12, 2026Вдохновившись проектом, где делали интерактивную карту с тем, как работает Postgres (писал…
  5. Sep 8, 2026OpenAI выложили блогпост https://openai.com/index/navier-stokes-solution/ Мы публикуем реш…
  6. Sep 8, 2026Если кто не знал, вокруг этого сейчас разгорается очень большой скандал с OpenAI. Кратко,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →