Сценарий находит в корзине заказанные позиции и удаляет их. Ошибка кода: после первого map получается список, а следующий map обращается к нему как к отдельному CartItem.
Анализ и рефакторинг существующего UseCase‑класса
Сценарий находит в корзине заказанные позиции и удаляет их. Ошибка кода: после первого map получается список, а следующий map обращается к нему как к отдельному CartItem.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В проекте присутствует реализация UseCase, написанная другим разработчиком. Требуется разобраться, какую бизнес‑логику реализует данный код, и провести его улучшение, сделав структуру более понятной и поддерживаемой.
class MainUseCase @Inject constructor(
private val firstUseCase: FirstUseCase,
private val secondUseCase: SecondUseCase
) {
@CheckResult
fun execute(result: Result): Completable {
val orderedItems = result.items
return if (orderedItems.isEmpty()) {
Completable.complete()
} else {
firstUseCase.getCartItems()
.map { cartItems ->
orderedItems.mapNotNull { orderItem ->
cartItems.firstOrNull { it.id == orderItem.id }
}
}
.map { cartItem ->
CartItemId(
cartItemId = cartItem.id,
skuId = cartItem.skuId,
bundleId = cartItem.bundleId,
isPrimaryBundleItem = cartItem.isPrimaryBundleItem
)
}
.flatMapCompletable {
if (it.isEmpty()) {
Completable.complete()
} else {
secondUseCase.deleteItems(it)
}
}
}
}
}
Ответ
Сценарий находит в корзине заказанные позиции и удаляет их. Ошибка кода: после первого map получается список, а следующий map обращается к нему как к отдельному CartItem.
Нужно преобразовывать элементы внутри списка:
return firstUseCase.getCartItems()
.map { cartItems ->
result.items.mapNotNull { ordered ->
cartItems.firstOrNull { it.id == ordered.id }
}.map { item ->
CartItemId(item.id, item.skuId, item.bundleId, item.isPrimaryBundleItem)
}
}
.flatMapCompletable { ids ->
if (ids.isEmpty()) Completable.complete()
else secondUseCase.deleteItems(ids)
}
Ранний выход для пустого result.items можно сохранить. Индекс корзины по ID ускорит поиск с O(nm) до O(n+m), но при дублях должен сохранять выбор первого элемента, иначе поведение изменится. Названия зависимостей лучше заменить на предметные после уточнения контракта.