Анализ и рефакторинг существующего UseCase‑класса

Сценарий находит в корзине заказанные позиции и удаляет их. Ошибка кода: после первого map получается список, а следующий map обращается к нему как к отдельному CartItem.

Короткий ответ

Что ответить на собеседовании

Сценарий находит в корзине заказанные позиции и удаляет их. Ошибка кода: после первого 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), но при дублях должен сохранять выбор первого элемента, иначе поведение изменится. Названия зависимостей лучше заменить на предметные после уточнения контракта.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее