Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Расскажи о последнем проекте
Краткое описание проекта
Мой последний крупный проект — это мобильное приложение для управления личными финансами с интегрированной аналитикой и синхронизацией с облаком. Приложение разрабатывалось для платформы Android с использованием Kotlin и современного стека технологий.
Архитектура и технический стек
Проект был структурирован по принципам Clean Architecture с разделением на три слоя:
- Domain слой — определение бизнес-логики и интерфейсов
- Application слой — реализация use cases и координация
- Infrastructure слой — работа с БД (Room), API, SharedPreferences
Технологический стек:
- Язык: Kotlin с использованием coroutines
- UI Framework: Android Jetpack (Compose, LiveData, ViewModel)
- Хранилище: Room Database для локального хранилища
- Сеть: Retrofit 2 с OkHttp для API запросов
- DI: Hilt для инъекции зависимостей
- Async: Coroutines и Flow для асинхронных операций
Ключевые компоненты
1. Data Layer
Реализовал репозиторий pattern для абстрагирования источников данных:
interface TransactionRepository {
fun getTransactions(): Flow<List<Transaction>>
suspend fun addTransaction(transaction: Transaction)
suspend fun deleteTransaction(id: String)
}
class TransactionRepositoryImpl(
private val localDataSource: TransactionLocalDataSource,
private val remoteDataSource: TransactionRemoteDataSource
) : TransactionRepository {
override fun getTransactions(): Flow<List<Transaction>> = flow {
val remote = remoteDataSource.getTransactions()
localDataSource.saveTransactions(remote)
emitAll(localDataSource.observeTransactions())
}.catch { error ->
emitAll(localDataSource.observeTransactions())
}
}
2. Use Cases
Каждая бизнес-функция реализована как отдельный use case:
class GetTransactionsSortedByDateUseCase(
private val repository: TransactionRepository
) {
operator fun invoke(): Flow<List<Transaction>> =
repository.getTransactions()
.map { transactions ->
transactions.sortedByDescending { it.date }
}
}
3. UI Layer (Jetpack Compose)
Переменный на Compose позволил реализовать динамичный и современный UI:
@Composable
fun TransactionsScreen(viewModel: TransactionsViewModel) {
val transactions by viewModel.transactions.collectAsState()
val isLoading by viewModel.isLoading.collectAsState()
LazyColumn {
items(transactions) { transaction ->
TransactionCard(transaction)
}
}
}
Решённые проблемы
Проблема 1: Синхронизация данных между устройствами
Использовал Firebase Cloud Firestore для real-time синхронизации. Реализовал conflict resolution стратегию (последний write побеждает):
class CloudSyncService(private val firestore: FirebaseFirestore) {
suspend fun syncTransactions(localTransactions: List<Transaction>) {
localTransactions.forEach { transaction ->
firestore.collection("transactions")
.document(transaction.id)
.set(transaction, SetOptions.merge())
}
}
}
Проблема 2: Производительность при большом количестве данных
Использовал Paging 3 library для ленивой загрузки и кеширования:
class TransactionsPagingSource(
private val repository: TransactionRepository
) : PagingSource<Int, Transaction>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Transaction> {
return try {
val page = params.key ?: 1
val transactions = repository.getTransactions(page, PAGE_SIZE)
LoadResult.Page(
data = transactions,
prevKey = if (page == 1) null else page - 1,
nextKey = if (transactions.isEmpty()) null else page + 1
)
} catch (e: Exception) {
LoadResult.Error(e)
}
}
}
Проблема 3: Тестирование асинхронного кода
Использовал MockK и Turbine для тестирования Flows:
@Test
fun testGetTransactions() = runTest {
val mockTransactions = listOf(
Transaction("1", "Food", 50.0),
Transaction("2", "Transport", 30.0)
)
coEvery { repository.getTransactions() } returns flowOf(mockTransactions)
useCase().test {
assertEquals(mockTransactions, awaitItem())
awaitComplete()
}
}
Результаты и метрики
- Время загрузки: улучшено с 3 сек до 400 мс за счёт lazy loading
- Потребление памяти: снизилось на 35% благодаря Paging 3
- Покрытие тестами: 87% unit test coverage
- Оценка в Play Store: 4.8 из 5 звёзд
Чему я научился
- Правильная архитектура масштабируемого приложения с использованием Clean Architecture
- Работа с асинхронным кодом через Coroutines и Flow
- Оптимизация производительности при работе с большими данными
- Тестирование сложного асинхронного кода
- Сотрудничество с бэкенд-командой по разработке API контракта
Этот проект укрепил мои навыки в архитектуре приложений и научил меня писать чистый, поддерживаемый и тестируемый код.