TGViewer
dev notes dev notes @junsenior · 1.39K subscribers
Post #277 995
Сейчас читаю книгу "Go with domains" про то, правильно приготовить DDD в Go.

Автор пишет:
While implementing your domain, you should stop thinking about structs like dummy data structures or “ORM like” entities with a list of setters and getters. You should instead think about them like types with behavior.


И ниже пример: когда вы разговариваете с кем-то про тренировки в тренажерном зале, вам не скажут: "я настроил состояние аттрибута training schedule на 13:00", вместо этого человек ответит: "я запланировал тренировку на 13:00".
Одна из концепций DDD - сделать логику такой же простой и читаемой, а не усложнять ее атрибутами, состояниями и прочими параметрами, которые в большинстве случаев не нужны.

Например, ответом на вопрос "Я могу записаться на тренировку в это время?" может быть или вот такой вот код:


func (s TrainerService) ScheduleTraining(ctx context.Context, request Request) error {
hour, found := s.FindHour(request.Hour)
if request.HasTrainingScheduled && !hour.Available {
//
}
if request.Available && request.HasTrainingScheduled {
//
}
if !request.Available && !request.HasTrainingScheduled {
//
}
}


в котором мы напишем полотно из условий, проверяя те или иные параметры. Или мы можем сделать тип Hour, для которого описать поведение ScheduleTraining, где мы или получим ошибку что время уже занято, или займем его, если оно доступно:


func (h *Hour) ScheduleTraining() error {
if !h.IsAvailable() {
return ErrHourNotAvailable
}

h.availability = TrainingScheduled

return nil
}


Таким образом внешняя логика, вызывающая этот метод, очень сильно упрощается и становится более читаемой. Более того, такую логику сильно проще покрывать тестами.
  • 👍 11
  • 🔥 4
  • 👾 3
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 →