Что такое Clean Architecture?

«Что такое Clean Architecture?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Clean Architecture (Чистая Архитектура) — это архитектурный подход, предложенный Робертом Мартином, который структурирует приложение в виде концентрических слоёв с чётким правилом зависимостей: внутренние слои не зависят от внешних. Цель — изолировать бизнес-логику и правила предметной области от деталей реализации (UI, базы данных, фреймворков).

Ключевые слои (изнутри наружу):

  1. Entities (Сущности): Базовые бизнес-объекты и правила, наименее подверженные изменениям (например, User, Account).
  2. Use Cases (Сценарии использования): Содержат специфичную бизнес-логику приложения. Они оркестрируют поток данных к сущностям и от них.
  3. Interface Adapters (Адаптеры интерфейсов): Преобразуют данные между форматами, удобными для Use Cases и внешними системами (например, Presenters, Controllers, Gateways).
  4. Frameworks & Drivers (Фреймворки и драйверы): Внешние инструменты (Spring, Hibernate, Web-сервер, БД). Этот слой меняется чаще всего.

Пример структуры на Java:

// 1. Entity (ядро)
public class User {
    private final UserId id;
    private final Email email;
    // Инварианты и бизнес-логика здесь
}

// 2. Use Case (ядро)
public interface UserRepository {
    void save(User user);
}

// 3. Interface Adapter (уровень представления/доступа к данным)
@RestController
public class UserController {
    private final CreateUserUseCase useCase; // Зависимость на Use Case (ядро)
    @PostMapping("/users")
    public void createUser(@RequestBody UserRequest request) {
        // ... преобразование DTO, вызов useCase.execute()
    }
}

Преимущества:

  • Независимость: Бизнес-логика не зависит от фреймворков, БД или UI.
  • Тестируемость: Ядро можно тестировать изолированно, без внешних зависимостей.
  • Гибкость: Замена внешних компонентов (например, СУБД или веб-фреймворка) требует минимальных изменений в ядре.