Рекомендации по рефакторингу инициализации множества переменных в одном методе

#java

#java

Вопрос:

Я пишу контроллер rest вместе с сервисом crud, который будет использовать устаревший код, который все еще используется в разных местах приложения. Его цель — экспортировать файл Excel. Я немного рефакторирую, чтобы получить более чистый код (настолько чистый, насколько это возможно в этой ситуации, я не хочу переписывать все приложение) и для упрощения модульного тестирования.

Итак, допустим, у меня есть метод, который вызывает множество сервисов с параметрами на основе фильтра (ввода), а затем использует его для создания файла Excel. Что было бы хорошей практикой для его очистки?

Я был бы признателен за некоторые советы и рекомендации, а также за хорошее обсуждение 😉

     @Override
    public Downloadable<Workbook> getExcel(ExcelFilterTO filter) {

    List<String> someList= someService.getString(filter.getParam1(), filter.getParam2()).stream().collect(toList());

    List<Integer> someList2 = someService.getInt(filter.getParam1(), filter.getParam2(), filter.getParam3(), filter.getParam4());

       TranslationSet translationsSet = translationService.getTranslationsSet(filter.getParam4(),
            TranslationsGroup.SOME_TYPE);

       SomeClass classObject = someService.doSomething(filter.getParam1());

    ...
    ...
    String fileSuffix = ExcelUtils.EXCEL_EXPORT_FILE_NAME_SUFFIX;

    ResourceBundle resourceBundle = ResourceBundle  .getBundle(BundleNames.getBundle(filter.getParam2()).getName());


    Workbook workbook = excelExport.exportExcel(someList, someList2 , fileSuffix, translationsSet, filter.getParam3());

    String fileName = excelExport.getExcelFileName(resourceBundle, someList3, filter.param6(), classObject);

    return new DownloadableResource<>(fileName, XLS.getContentType(), workbook);
    }`
  

Ответ №1:

Я думаю, вы могли бы обернуть все List<Sting> объекты в одну строку с запятыми и инициализировать их в предыдущих строках. Например List<String> obj1, obj2, obj3, ...;

Ответ №2:

Вы можете сократить свою инициализацию, добавив служебные методы, но я думаю, это дело вкуса.

 // utility method
List<Integer> intList(Supplier<String> param1, Supplier<String> param2) {
    return someService.getString(param1.apply(filter), param2.apply(filter)).stream().collect(toList());
}
  

и

 // utility method
List<String> stringList(Supplier<String> param1, Supplier<String> param2) {
    return someService.getString(filter.getParam1(), filter.getParam2()).stream().collect(toList());
}
  

таким образом, вы можете иметь

 List<Integer> someList2 = intList(filter::getParam1, filter::getParam2);
List<Integer> someList4 = intList(filter::getParam4, filter::getParam3);
  

и

 List<String> someList = stringList(filter::getParam1, filter::getParam2);
List<String> someList3 = stringList(filter::getparam6, filter::getParam5);
  

в вашем конструкторе.