Kchaiu
7 subscribers
1 photo
3 videos
1 file
4 links
Download Telegram
Привет
1
У меня есть новый канал @AutDreams67
Я здесь
🖕3
🫴🏿
Здорово всем я вернулся спасибо за
Каким образом происходит преобразование(mapping) данных(моделек/DTO)?
Взять любую модельку, и преобразовать с слоя data на domain модель
ответ
Mapping — это шаг, где берём модель из data слоя (обычно DTO после запроса) и превращаем её в domain модель. Это нужно, чтобы работать с «чистыми» данными в бизнес-логике приложения. Domain модель не зависит от того, как данные хранятся или приходят из сети/базы.
код
// ---------------- Data слой ----------------

// DTO — модель данных из API
data class UserDto(
val id: Long?, // ID может быть null из API
val username: String?, // имя пользователя может быть null
val email: String?, // email может быть null
val createdAt: String? // дата создания как строка
)

// ---------------- Domain слой ----------------

// Domain модель — удобна для бизнес-логики
data class User(
val id: Long,
val name: String,
val email: String,
val createdAt: Long
)

// Mapper: преобразует DTO в domain модель
class UserMapper {
fun map(dto: UserDto): User {
return User(
id = dto.id ?: 0, // если id null — ставим 0
name = dto.username ?: "Unknown", // если имя null — "Unknown"
email = dto.email ?: "", // если email null — пустая строка
createdAt = dto.createdAt?.toLongOrNull() ?: 0 // преобразуем дату в Long
)
}
}

// Repository: получает данные и возвращает domain модель
class UserRepository(
private val api: UserApi,
private val mapper: UserMapper
) {
suspend fun getUser(): User {
val dto = api.getUser() // получаем DTO из API
return mapper.map(dto) // преобразуем в domain модель
}
}

// API интерфейс
interface UserApi {
suspend fun getUser(): UserDto
}
Каким образом указывается Dispatcher для работы корутины?
Написать полную обработку запроса с указанием Dispatcher
ответ
В Kotlin Coroutines Dispatcher определяет, на каком потоке выполняется код. Для работы с UI используют Dispatchers.Main, для сетевых или файловых операций — Dispatchers.IO, а для тяжёлых вычислений — Dispatchers.Default. При запросе данных корутина запускается на главном потоке, а сам сетевой или базовый запрос выполняется на IO-потоке через withContext(Dispatchers.IO). После получения данных они преобразуются в domain модель и возвращаются на главный поток для обновления интерфейса пользователя. Такой подход позволяет не блокировать UI и безопасно работать с данными.
class UserViewModel(private val repository: UserRepository) : ViewModel() {

val userLiveData = MutableLiveData<User>()
val errorLiveData = MutableLiveData<String>()

fun fetchUser() {
// Корутина запускается на главном потоке, чтобы можно было обновлять UI
viewModelScope.launch(Dispatchers.Main) {
try {
// Выполняем запрос в фоновом потоке IO
val user = withContext(Dispatchers.IO) {
val dto = repository.getUser() // получение DTO из API
repository.mapper.map(dto) // преобразуем в domain модель
}
// Возвращаем результат на Main поток и обновляем LiveData
userLiveData.value = user
} catch (e: Exception) {
// В случае ошибки обновляем LiveData с сообщением
errorLiveData.value = "Ошибка: ${e.message}"
}
}
}
}
Как выглядит базовый(обычный) Use case в слое domain? Привести пример из кода
ответ