← Назад к вопросам

Что такое чистая архитектура?

2.0 Middle🔥 241 комментариев
#Архитектура Flutter#ООП и паттерны

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Чистая архитектура в Flutter

Чистая архитектура (Clean Architecture) — это подход к организации кода, разработанный Robert Martin. Цель: сделать код независимым от фреймворков, баз данных, UI и легко тестируемым.

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

Все слои организованы как слои луковицы, где каждый слой зависит только от более внутренних:

┌─────────────────────────────────────────┐
│  Presentation (UI, State Management)    │
├─────────────────────────────────────────┤
│  Application (Use Cases, Controllers)   │
├─────────────────────────────────────────┤
│  Domain (Entities, Repository interfaces)│
├─────────────────────────────────────────┤
│  Infrastructure (API, Database)         │
└─────────────────────────────────────────┘

Слои архитектуры

Domain Layer — самый независимый слой, содержит бизнес-логику:

// Entity
class User {
  final String id;
  final String name;
  final String email;
  
  User({required this.id, required this.name, required this.email});
}

// Repository Interface
abstract class UserRepository {
  Future<User> getUserById(String id);
  Future<void> saveUser(User user);
}

Application Layer — use cases и controllers. Каждый use case решает одну задачу:

class GetUserUseCase {
  final UserRepository repository;
  
  GetUserUseCase(this.repository);
  
  Future<User> call(String userId) async {
    return await repository.getUserById(userId);
  }
}

Infrastructure Layer — реализация репозиториев, API, база данных:

class UserRepositoryImpl implements UserRepository {
  final ApiClient apiClient;
  
  UserRepositoryImpl(this.apiClient);
  
  @override
  Future<User> getUserById(String id) async {
    final response = await apiClient.get(/users/);
    return User.fromJson(response);
  }
  
  @override
  Future<void> saveUser(User user) async {
    await apiClient.post(/users, user.toJson());
  }
}

Presentation Layer — UI, виджеты, state management:

class UserScreen extends StatelessWidget {
  final GetUserUseCase useCase;
  
  const UserScreen({required this.useCase});
  
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<User>(
      future: useCase(user-123),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Text(snapshot.data!.name);
        }
        return const CircularProgressIndicator();
      },
    );
  }
}

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

  • Тестируемость — легко писать unit-тесты, так как слои независимы
  • Масштабируемость — код растёт упорядоченно
  • Переиспользование — бизнес-логика не привязана к UI
  • Простая смена деталей — меняешь API или БД без изменения бизнес-логики

Чистая архитектура требует больше кода, но окупается на крупных проектах.