Ответ
В Чистой архитектуре (Clean Architecture) поток управления направлен от внешних слоёв к внутренним.
Это означает, что выполнение обычно инициируется внешним событием (например, HTTP-запрос от пользователя) и движется вглубь системы для обработки.
Типичная последовательность:
- Presentation / Frameworks (внешний слой): Контроллер получает запрос.
- Application / Use Cases (промежуточный слой): Контроллер вызывает соответствующий сервис или сценарий использования (Use Case).
- Domain / Entities (внутренний слой): Сервис использует доменные сущности для выполнения основной бизнес-логики.
Пример потока:
# 3. Внутренний слой (Domain)
class User:
def __init__(self, name: str):
if not name:
raise ValueError("Name cannot be empty")
self.name = name
# 2. Промежуточный слой (Application)
class UserService:
def __init__(self, user_repository):
self.user_repository = user_repository
def create_user(self, name: str) -> User:
user = User(name) # Выполняется бизнес-логика домена
self.user_repository.save(user)
return user
# 1. Внешний слой (Presentation)
class UserController:
def __init__(self, user_service: UserService):
self.user_service = user_service
def handle_request(self, data: dict):
# Поток начинается здесь
try:
user = self.user_service.create_user(data['name'])
return {"status": "success", "user_id": user.id}
except ValueError as e:
return {"status": "error", "message": str(e)}
Таким образом, поток управления инициируется извне (UserController) и делегируется внутренним слоям (UserService, User) для выполнения работы.
Ответ 18+ 🔞
Да ты посмотри, какая хуйня творится в этой вашей Чистой Архитектуре! Всё у них наоборот, блядь, как будто в жопу задом наперёд залезли. Поток управления, ёпта, идёт от внешних слоёв к внутренним, сука!
Представь: сидит какой-нибудь пользователь, долбоёб, тыкнул кнопку. Это ж внешнее событие, пиздец! С него всё и начинается, как гром среди ясного неба.
Вот как это, блядь, работает, если по полочкам, хоть они и кривые:
- Презенташка / Фреймворки (внешний слой, где всё воняет чужим кодом): Прилетает, блядь, HTTP-запрос, и его ловит какой-нибудь контроллер, типа наш
UserController. Он как швейцар у парадного входа, только без мозгов. - Приложение / Юзкейсы (промежуточный слой, где думают, что они умные): Этот контроллер, тупой как пробка, не сам же всё делать будет. Он орет: "Эй,
UserService, иди сюда, блядь, разберись с этим долбоёбом-пользователем!" И передает ему данные. - Домен / Сущности (внутренний, священный слой, где живёт сама логика): Сервис, такой весь из себя важный, берет эти данные и идет к настоящим мужикам — к доменным сущностям, типа
User. "Вот, — говорит, — имя, валидируй нахуй, это твоя работа". А сам стоит, ждет, как олух.
Смотри, как это в коде выглядит, чтоб ты, блядь, проникся:
# 3. Внутренний слой (Domain) — тут мозги
class User:
def __init__(self, name: str):
if not name: # А ну-ка, проверим этого умника
raise ValueError("Name cannot be empty") # Не-не-не, дружок, так не пойдет!
self.name = name
# 2. Промежуточный слой (Application) — тут посредники
class UserService:
def __init__(self, user_repository):
self.user_repository = user_repository
def create_user(self, name: str) -> User:
user = User(name) # Эй, домен, делай дело, ёбана!
self.user_repository.save(user) # Сохраняем куда сказали
return user
# 1. Внешний слой (Presentation) — тут входящие дураки
class UserController:
def __init__(self, user_service: UserService):
self.user_service = user_service
def handle_request(self, data: dict):
# Всё начинается тут, с какого-то левого запроса!
try:
user = self.user_service.create_user(data['name']) # Эй, сервис, работай!
return {"status": "success", "user_id": user.id}
except ValueError as e: # Ага, попался, мудила!
return {"status": "error", "message": str(e)}
Короче, вся эта ебля стартует снаружи, с какого-нибудь UserController, а потом как по канализационной трубе проваливается внутрь, к UserService и User, которые уже и делают всю грязную работу. А контроллер потом еще и ответить должен, хитрая жопа. Вот такой, блядь, круговорот зависимостей в архитектуре!