Слои и стрелки зависимостей: все внутрь
Слои и стрелки зависимостей: все внутрь

Слои

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

  • Домен (domain): сущности и бизнес-правила (Task.complete()); ни от чего (БД, веб) не зависит.
  • Сервисы (use cases): сценарии «создать задачу», «завершить»; координируют домен и интерфейсы репозиториев.
  • Инфраструктура: БД, файлы, HTTP, почта: все «внешние» детали.
  • UI / API: CLI, веб-страницы, REST: общение с пользователем.

Связанные темы: SRP, связанность и сцепление.

Слой домена

Классы домена — обычные объекты Python: правила живут внутри них, о базе данных они ничего не знают. Поэтому их можно тестировать за секунды.

python
from dataclasses import dataclass

@dataclass
class Task:
    id: int
    title: str
    done: bool = False

    def complete(self):
        if self.done:
            raise ValueError("task already done")
        self.done = True

t = Task(1, "write tests")
t.complete()
print(t)
try:
    t.complete()
except ValueError as e:
    print("error:", e)
text
Task(id=1, title='write tests', done=True)
error: task already done

Правило зависимостей