Clean Architecture + MVVM:
Presentation (UI) → Domain (Use Cases) → Data (Repositories)
Модульная структура:
:app
:feature:auth
:feature:product
:feature:cart
:feature:checkout
:core:network
:core:database
:core:utils
Пример экрана товара:
@Composable
fun ProductScreen(viewModel: ProductViewModel = hiltViewModel()) {
val state by viewModel.state.collectAsState()
LazyColumn {
item { ProductHeader(state.product) }
item { ProductGallery(state.images) }
item { ProductDescription(state.details) }
item { AddToCartButton(onClick = { viewModel.addToCart() }) }
}
}
Пример Use Case:
class GetProductsUseCase @Inject constructor(
private val repository: ProductRepository
) {
operator fun invoke(): Flow<PagingData<Product>> {
return repository.getProducts()
.cachedIn(viewModelScope)
}
}
Пример репозитория:
class ProductRepositoryImpl @Inject constructor(
private val api: ProductApi,
private val dao: ProductDao
) : ProductRepository {
override fun getProducts(): Flow<PagingData<Product>> {
return Pager(
config = PagingConfig(pageSize = 20),
remoteMediator = ProductRemoteMediator(api, dao)
) {
dao.getProductsPagingSource()
}.flow
}
}
Пример теста:
@Test
fun `product should be added to cart`() = runTest {
val repository = mockk<ProductRepository>()
val useCase = AddToCartUseCase(repository)
useCase.invoke(productId = "123")
coVerify { repository.addToCart("123") }
}
Масштабируемость:
Поддержка Google:
Производительность:
Безопасность:
Для интернет-магазина я выбрал бы Kotlin + Jetpack Compose + Clean Architecture как основу, с обязательным внедрением пагинации, оффлайн-режима и современных инструментов анимации. Такой стек обеспечит плавную работу, легкую поддержку и возможность быстро добавлять новые функции.