В исходнике report может остаться неинициализированным при неизвестном типе. Вынесите ветви в отдельные методы и явно обработайте неподдерживаемые значения.
Рефакторинг метода формирования отчёта
В исходнике report может остаться неинициализированным при неизвестном типе. Вынесите ветви в отдельные методы и явно обработайте неподдерживаемые значения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Метод myBusinessLogic получает объект inputData и в зависимости от его типа (CUSTOMER, NONE_CUSTOMER, VIP) формирует объект Report. Требуется переписать метод, устранив дублирование, повысив читаемость и подготовив его к дальнейшему расширению.
class SuperService {
public Report myBusinessLogic(InputData inputData) {
Report report;
if (inputData.getType().equals("CUSTOMER")) {
report = doWorkWithData(inputData);
} else if (inputData.getType().equals("NONE_CUSTOMER")) {
// 20 строк кода
report = result;
} else if (inputData.getType().equals("VIP")) {
// 40 строк кода
report = result;
}
return report;
}
}
Ответ
В исходнике report может остаться неинициализированным при неизвестном типе. Вынесите ветви в отдельные методы и явно обработайте неподдерживаемые значения.
public Report myBusinessLogic(InputData data) {
Objects.requireNonNull(data);
String type = Objects.requireNonNull(data.getType());
switch (type) {
case "CUSTOMER": return doWorkWithData(data);
case "NONE_CUSTOMER": return buildNonCustomerReport(data);
case "VIP": return buildVipReport(data);
default: throw new IllegalArgumentException("Unsupported type");
}
}
Два новых метода содержат существующие 20 и 40 строк логики: их содержание в условии отсутствует, поэтому его нельзя восстановить. Для закрытого набора типов полезен enum; при независимом расширении — registry стратегий. Не нужно вводить сложную иерархию только ради трёх коротких ветвей.