Java · 32 строк
Сервис переводит деньги между счетами клиентов и берёт комиссию 1,5 % с отправителя. Код пришёл на ревью перед релизом. Отметьте строки с ошибками.
Сервис крутится в трёх подах за балансировщиком, AccountRepository каждый раз читает счёт из базы и возвращает новый объект.
В работе: Переводы по номеру счёта в мобильном банке: десятки тысяч операций в минуту в пятницу вечером.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: Т‑Банк: секция Java, код-ревью с доработкой под бизнес-задачу. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
@Servicepublic class TransferService {private static final Logger log = LoggerFactory.getLogger(TransferService.class);private static final double FEE_RATE = 0.015;private final JdbcTemplate jdbc;private final AccountRepository accounts;public TransferService(JdbcTemplate jdbc, AccountRepository accounts) {this.jdbc = jdbc;this.accounts = accounts;}public TransferResult transfer(String fromId, String toId, double amount, String cardNumber) {log.info("Перевод {} -> {}, сумма {}, карта {}", fromId, toId, amount, cardNumber);Account from = accounts.findById(fromId);Account to = accounts.findById(toId);double fee = amount * FEE_RATE;if (from.getBalance() < amount + fee) {return TransferResult.rejected("Недостаточно средств");}synchronized (this) {from.setBalance(from.getBalance() - amount - fee);to.setBalance(to.getBalance() + amount);}accounts.save(from);accounts.save(to);jdbc.update("INSERT INTO transfers(from_id, to_id, amount, fee) VALUES ('"+ fromId + "', '" + toId + "', " + amount + ", " + fee + ")");return TransferResult.ok(fee);}}