В мире Android-разработки идут постоянные споры о выборе архитектуры. Чистая архитектура (Clean Architecture), предложенная Робертом Мартином, долгое время считалась золотым стандартом. Однако современные реалии и появление таких подходов как BLoC (Business Logic Component) заставляют пересмотреть устоявшиеся догмы.
Основная идея чистой архитектуры - изоляция бизнес-логики от платформы - на практике оказывается избыточной. В реальных проектах переиспользование бизнес-логики между разными платформами происходит крайне редко, а если и происходит, то требует специальных технологий вроде Kotlin Multiplatform.
Традиционное разделение на data/domain/presentation слои приводит к:
BLoC предлагает альтернативу, основанную на:
Рассмотрим реализацию функции аутентификации в обоих подходах:
// Domain
interface AuthRepository
class AuthUseCase(repo: AuthRepository)
// Data
class AuthRepositoryImpl: AuthRepository
// Presentation
class AuthViewModel(useCase: AuthUseCase)
class AuthBloc(authService: AuthService) {
private val _state = MutableStateFlow<AuthState>(Idle)
val state: StateFlow<AuthState> = _state.asStateFlow()
fun sendEvent(event: AuthEvent) { ... }
}
BLoC версия более компактна и содержит всю логику в одном месте, сохраняя при этом тестируемость.
Чистая архитектура сохраняет ценность в:
In the world of Android development, there are constant debates about architecture choice. Clean Architecture, proposed by Robert Martin, was long considered the gold standard. However, modern realities and the emergence of approaches like BLoC (Business Logic Component) force us to reconsider established dogmas.
The main idea of Clean Architecture - isolating business logic from the platform - proves excessive in practice. In real projects, reuse of business logic between different platforms is extremely rare, and when it does happen, it requires special technologies like Kotlin Multiplatform.
The traditional separation into data/domain/presentation layers leads to:
BLoC offers an alternative based on:
Let's examine the implementation of authentication feature in both approaches:
// Domain
interface AuthRepository
class AuthUseCase(repo: AuthRepository)
// Data
class AuthRepositoryImpl: AuthRepository
// Presentation
class AuthViewModel(useCase: AuthUseCase)
class AuthBloc(authService: AuthService) {
private val _state = MutableStateFlow<AuthState>(Idle)
val state: StateFlow<AuthState> = _state.asStateFlow()
fun sendEvent(event: AuthEvent) { ... }
}
The BLoC version is more compact and contains all logic in one place while maintaining testability.
Clean Architecture retains value in:
BLoC предлагает более современный и прагматичный подход к организации кода в Android-разработке. Он сохраняет ключевые преимущества чистой архитектуры (тестируемость, разделение ответственности), но без избыточного усложнения. Для большинства современных мобильных проектов BLoC оказывается более подходящим выбором.
BLoC offers a more modern and pragmatic approach to code organization in Android development. It preserves the key advantages of clean architecture (testability, separation of concerns) but without excessive complexity. For most modern mobile projects, BLoC proves to be a more suitable choice.