Войти Регистрация
Код-ревью

1. Перевод между счетами с комиссией

Средняя

Java · 32 строк

Сервис переводит деньги между счетами клиентов и берёт комиссию 1,5 % с отправителя. Код пришёл на ревью перед релизом. Отметьте строки с ошибками.

Сервис крутится в трёх подах за балансировщиком, AccountRepository каждый раз читает счёт из базы и возвращает новый объект.

В работе: Переводы по номеру счёта в мобильном банке: десятки тысяч операций в минуту в пятницу вечером.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
деньгитранзакцииблокировкиSQL-инъекция

Источник: Т‑Банк: секция Java, код-ревью с доработкой под бизнес-задачу. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. @Service
  2. public class TransferService {
  3. private static final Logger log = LoggerFactory.getLogger(TransferService.class);
  4. private static final double FEE_RATE = 0.015;
  5. private final JdbcTemplate jdbc;
  6. private final AccountRepository accounts;
  7. public TransferService(JdbcTemplate jdbc, AccountRepository accounts) {
  8. this.jdbc = jdbc;
  9. this.accounts = accounts;
  10. }
  11. public TransferResult transfer(String fromId, String toId, double amount, String cardNumber) {
  12. log.info("Перевод {} -> {}, сумма {}, карта {}", fromId, toId, amount, cardNumber);
  13. Account from = accounts.findById(fromId);
  14. Account to = accounts.findById(toId);
  15. double fee = amount * FEE_RATE;
  16. if (from.getBalance() < amount + fee) {
  17. return TransferResult.rejected("Недостаточно средств");
  18. }
  19. synchronized (this) {
  20. from.setBalance(from.getBalance() - amount - fee);
  21. to.setBalance(to.getBalance() + amount);
  22. }
  23. accounts.save(from);
  24. accounts.save(to);
  25. jdbc.update("INSERT INTO transfers(from_id, to_id, amount, fee) VALUES ('"
  26. + fromId + "', '" + toId + "', " + amount + ", " + fee + ")");
  27. return TransferResult.ok(fee);
  28. }
  29. }