Как я могу уменьшить когнитивную сложность в этом блоке? Кстати, как это может быть больше разрешенных 15?

У меня есть этот код:

       private void processMedia(Integer mediaId, List<String> hiresPhysicalPaths) {
        final AtomicBoolean isHls = new AtomicBoolean(false);
        for (String hiresPhysicalPath : hiresPhysicalPaths) {
            REPORT.info("Process media version {} for media {} ", hiresPhysicalPath, mediaId);
            String folderName = StringUtils.substringBefore(hiresPhysicalPath, "/");
            File dir = new File(MediaRepositoryTools.getCurrentMediaPhysicalRootPath(App.getApplicationSession()), folderName);
            REPORT.info("Dir : {}", dir);
            File[] directoryListing = dir.listFiles();
            if (directoryListing == null) {
                REPORT.warn("Dir is not really a directory");
                return;
            }
            String mediaIdString = mediaId.toString();
            // loop pour savoir si le média est HLS ou pas
            for (File child : directoryListing) {
                String ext = FilenameUtils.getExtension(child.getName()).toLowerCase();
                String childFileName = FilenameUtils.getBaseName(child.getName());
                //If m3u8 file ex : 3180734-9u83wns9eh-m3u8.m3u8
                try {
                    if (isMediaHls(mediaIdString, childFileName, ext)) {
                        miseAJourFichierHLS(child);
                        REPORT.info("Le fichier m3u8 a été mis à jour pour la version : {} du média {} ", hiresPhysicalPath, mediaId);
                    } else {
                        REPORT.info("Le fichier m3u8 n'a pas été mis à jour pour la version : {} du média {} ", hiresPhysicalPath, mediaId);
                    }
                } catch (IOException e) {
                    REPORT.error("Unable to update the HLS file for media " + mediaId, e);
                }
                isHls.set(true);

                if (childFileName.startsWith(mediaIdString) && isFileNeededToBeDeleted(child.getName(), isHls.get())) {
                    this.copyOrDelete(child);
                }
            }
        }
        App.getService(TransactionService.class).withTransaction(() -> this.updatePreviewGeneratedFlagForMedia(mediaId, isHls.get()));
    }

Сонар сказал мне уменьшить когнитивную сложность с 16 до 15, я не знаю, как это может быть так много, так как там нет вложенных условий, может быть, я ошибаюсь.

РЕДАКТИРОВАТЬ: я отредактировал код, чтобы показать вам исходный код, в котором ничего не пропало, я приму во внимание ваши опасения, особенно по поводу сложности кода.

1 ответ

Я думаю, вы немного неправильно думаете о когнитивной сложности.

Общая идея следующая:

  1. Игнорируйте структуры, которые позволяют сократить несколько операторов до одного.
  2. Увеличивайте (добавляйте единицу) для каждого разрыва в линейном потоке кода.
  3. Приращение при вложении прерывающих поток структур

Так что же происходит в вашем коде?
Каждое объявление переменной+1для оценки.
Каждое объявление цикла for — это
Every try catch, а несколько catch —+1.
Подробнее об этом можно прочитать здесь

Что вы могли бы сделать, чтобы исправить это?

Ну, вы можете проверить, нужна ли каждая переменная.
Вы можете попытаться избавиться от предложений try и catch или if.
Что бы я сделал, это попытаться создать другой метод для этой части:


          for (File child : directoryListing) {
            String ext = FilenameUtils.getExtension(child.getName()).toLowerCase();
            String childFileName = FilenameUtils.getBaseName(child.getName());
            //If m3u8 file ex : 3180734-9u83wns9eh-m3u8.m3u8
            try {
                if (isMediaHls(mediaIdString, childFileName, ext)) {
                    miseAJourFichierHLS(child);
                    REPORT.info(" TODO "     } else {
                    REPORT.info(" TODO  ", hiresPhysicalPath, mediaId);
                }
            } catch (IOException e) {
                REPORT.error("TODO " + mediaId, e);
            }
            isHls.set(true);

            if (childFileName.startsWith(mediaIdString) && isFileNeededToBeDeleted(child.getName(), isHls.get())) {
                this.copyOrDelete(child);
            }
        }

Также вы должны попытаться разделить свой метод на более мелкие части, чтобы вы могли легко понять, какая часть что делает. ТвойprocessMediaметод делает слишком много. Сделайте это более простым и разделите его. Это подход из чистого кода. Вы можете прочитать немного больше об этом здесь

Другие вопросы по тегам