Java · 33 строк
checkout вызывается по кнопке «Оформить заказ». Сервис цен и сервис доставки отвечают по сети за 50–300 мс. После возврата из метода клиенту показывают «Заказ оформлен».
Отметьте строки с ошибками.
В работе: Бэкенд оформления заказа.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 2 вопроса про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: на данных Ozon: корзина и оформление заказа. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
import java.util.List;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutorService;public class CheckoutService {private final ExecutorService io;private final PriceClient prices;private final DeliveryClient delivery;private final OrderRepo orders;public CheckoutService(ExecutorService io, PriceClient prices, DeliveryClient delivery, OrderRepo orders) {this.io = io;this.prices = prices;this.delivery = delivery;this.orders = orders;}// После возврата клиенту показывают «Заказ оформлен».public void checkout(long cartId, List<Long> skus) {CompletableFuture<Long> total = CompletableFuture.supplyAsync(() -> prices.sum(skus), io).exceptionally(e -> 0L);CompletableFuture<Long> shipping = CompletableFuture.supplyAsync(() -> delivery.cost(cartId));total.thenCombine(shipping, Long::sum).thenAccept(sum -> orders.create(cartId, sum));}}interface PriceClient { long sum(List<Long> skus); }interface DeliveryClient { long cost(long cartId); }interface OrderRepo { long create(long cartId, long totalKop); }