Слои
Деление большой программы на слои гарантирует, что каждая часть занимается одним делом:
- Домен (domain): сущности и бизнес-правила (
Task.complete()); ни от чего (БД, веб) не зависит. - Сервисы (use cases): сценарии «создать задачу», «завершить»; координируют домен и интерфейсы репозиториев.
- Инфраструктура: БД, файлы, HTTP, почта: все «внешние» детали.
- UI / API: CLI, веб-страницы, REST: общение с пользователем.
Связанные темы: SRP, связанность и сцепление.
Слой домена
Классы домена — обычные объекты 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)Task(id=1, title='write tests', done=True)
error: task already done