#518 Код-ревью сервиса определения типа мяча

Компании:
Сбербанк
Темы:
SpringОсновы SpringКод ревью

Имеется сервис определения типа мяча по ID мяча.

Известно, что:

  • Вызываемый сервис BallPropertiesService возвращает список свойств (List) для одного мяча. Размер списка от 0 до 2^30;
  • Значения BallProperty.code от 0 до 9 описывают размер мяча (т.е. 0 - микроскопический, 9 - гигантский);
  • Значения BallProperty.code от 100 до 129 описывают материал мяча;
  • Значения BallProperty.code в других диапазонах существуют, но бизнес ценности в данном случае не несут.

Если в списке:

  • Пришел проперти с кодом 7, то считаем, что мяч баскетбольный;
  • Пришел проперти с кодом 6, то считаем, что мяч футбольный;
  • Пришел проперти с кодом 5, то считаем, что мяч тенисный;
  • Пришел проперти с кодом 5 и еще проперти 102, то считаем, что это ядро;
  • Не пришло что-то из выше описанного, то считаем, что это мяч для пингпонга.

Гарантируется, что если в списке присутствует BallProperty с кодом из какого-то диапазона, то не может быть в этом же списке BallProperty с другим кодом из этого диапазона (т.е. в одном списке не будет одновременно кодов 1 и 2).

Что не так в данном коде?

@Service
@RequiredArgsConstructor
public class BallTypeService {
    private final BallPropertiesService ballPropertiesService;

    public BallType getType(Long ballId) {
        List<BallProperty> ballProperties = ballPropertiesService.getBallProperties(ballId);
        ballProperties.sort(Comparator.comparing(BallProperty::getCode).reversed());

        return resolveType(ballProperties);
    }

    private BallType resolveType(List<BallProperty> ballProperties) {
        long propertyNum = ballProperties.get(0).getCode();
        long propertyNext = ballProperties.get(1).getCode();
        if (propertyNum == 102 && propertyNext == 5) {
            return BallType.CANNON_BALL;
        }
        if (propertyNum == 7) {
            return BallType.BASKET_BALL;
        }
        if (propertyNum == 6) {
            return BallType.FOOT_BALL;
        }
        if (propertyNum == 5) {
            return BallType.TENNIS_BALL;
        }
        return BallType.PING_PONG_BALL;
    }
}

public enum BallType {
    BASKET_BALL,
    FOOT_BALL,
    CANNON_BALL,
    TENNIS_BALL,
    PING_PONG_BALL;
}

// библиотечный код
@Data
public class BallProperty {
    private Integer group;
    private Integer code;
    private String description;
}

public interface BallPropertiesService {
    List<BallProperty> getBallProperties(Long itemId);
}

Разбор вопроса

Ментор
Ответь как на реальном собеседовании. Я задам уточняющие вопросы, а затем сравню твой ответ с эталонным и покажу точность в %.
Войди, чтобы начать диалог Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти