Чистая архитектура (Clean Architecture) — это подход к проектированию программного обеспечения, предложенный Робертом Мартином (Uncle Bob). Давайте разберем основные принципы и их практическое применение.
Основные принципы
Слои приложения
Чистая архитектура разделяет приложение на концентрические слои:
- Entities — бизнес-логика
- Use Cases — прикладная логика
- Interface Adapters — адаптеры (контроллеры, презентеры)
- Frameworks & Drivers — внешние инструменты
# Entities - чистая бизнес-логика
class User:
def __init__(self, email, password):
self.email = email
self.password = password
def is_valid_email(self):
return '@' in self.email
# Use Cases
class UserRegistration:
def __init__(self, user_repository):
self.repository = user_repository
def execute(self, email, password):
user = User(email, password)
if not user.is_valid_email():
raise ValueError("Invalid email")
return self.repository.save(user)
# Interface Adapters
class UserController:
def __init__(self, registration_use_case):
self.use_case = registration_use_case
def register(self, request_data):
try:
user = self.use_case.execute(
request_data['email'],
request_data['password']
)
return {'success': True, 'user_id': user.id}
except ValueError as e:
return {'success': False, 'error': str(e)}
Dependency Inversion
Ключевой принцип — зависимости направлены внутрь, к бизнес-логике.
from abc import ABC, abstractmethod
# Абстракция (в слое Use Cases)
class UserRepository(ABC):
@abstractmethod
def save(self, user):
pass
@abstractmethod
def find_by_email(self, email):
pass
# Реализация (во внешнем слое)
class SQLUserRepository(UserRepository):
def __init__(self, db_connection):
self.db = db_connection
def save(self, user):
# Сохранение в SQL
pass
def find_by_email(self, email):
# Поиск в SQL
pass
Тестируемость
Чистая архитектура делает код легко тестируемым.
# Тестирование без реальной БД
class MockUserRepository(UserRepository):
def __init__(self):
self.users = []
def save(self, user):
user.id = len(self.users) + 1
self.users.append(user)
return user
def find_by_email(self, email):
return next((u for u in self.users if u.email == email), None)
# Тест
def test_user_registration():
repo = MockUserRepository()
use_case = UserRegistration(repo)
result = use_case.execute("test@example.com", "password123")
assert result.id == 1
Преимущества
- Независимость от фреймворков — бизнес-логика не зависит от Django/Flask
- Тестируемость — легко писать юнит-тесты
- Независимость от БД — можно менять базу данных
- Масштабируемость — код легко расширяется
Недостатки
- Больше кода — требуется больше классов и интерфейсов
- Сложность — нужно понимание архитектурных паттернов
- Overkill для малых проектов — избыточно для простых приложений
Заключение
Чистая архитектура — мощный инструмент для больших и сложных проектов. Она обеспечивает гибкость, тестируемость и долгосрочную поддерживаемость кода.
Комментарии (1)
Войдите, чтобы оставить комментарий
Интересный взгляд на проблему. Не согласен с некоторыми моментами, но в целом качественно.