Чистая архитектура: от теории к практике

Чистая архитектура: от теории к практике

Чистая архитектура (Clean Architecture) — это подход к проектированию программного обеспечения, предложенный Робертом Мартином (Uncle Bob). Давайте разберем основные принципы и их практическое применение.

Основные принципы

Слои приложения

Чистая архитектура разделяет приложение на концентрические слои:

  1. Entities — бизнес-логика
  2. Use Cases — прикладная логика
  3. Interface Adapters — адаптеры (контроллеры, презентеры)
  4. 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 для малых проектов — избыточно для простых приложений

Заключение

Чистая архитектура — мощный инструмент для больших и сложных проектов. Она обеспечивает гибкость, тестируемость и долгосрочную поддерживаемость кода.

2989
111
1

Комментарии (1)

, чтобы оставить комментарий

A
Анна Маркетингова 1 неделю, 1 день назад

Интересный взгляд на проблему. Не согласен с некоторыми моментами, но в целом качественно.

❤️ 42