Kotlin · 30 строк
У клиента обычно 2–4 карты: дебетовая, кредитная и детская. Операции за месяц по одной карте приходят из старого API operationsBlocking — обычного блокирующего вызова, обычно за 200 мс, иногда за 20 секунд.
Карта, которая не ответила за 3 секунды, должна попасть в failed, а экран — показать остальное. Отметьте строки с ошибками.
В работе: Бэкенд мобильного приложения, экран «Выписка за месяц».
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 2 вопроса про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: наша задача на данных Т‑Банка: выписка по картам клиента. Условие пересказано своими словами.
Давали на собеседовании?
import kotlinx.coroutines.*import kotlinx.coroutines.channels.Channeldata class Statement(val operations: List<Operation>, val failed: List<String>)class StatementLoader(private val bank: BankApi) {suspend fun load(cards: List<String>, month: String): Statement = coroutineScope {val ch = Channel<Operation>(capacity = 100)val failed = mutableListOf<String>()cards.forEach { card ->launch(Dispatchers.IO) {try {withTimeout(3_000) {bank.operationsBlocking(card, month).forEach { ch.send(it) }}} catch (e: TimeoutCancellationException) {failed.add(card)}}}val operations = mutableListOf<Operation>()for (op in ch) {operations.add(op)}Statement(operations.sortedByDescending { it.date }, failed)}}