Как я могу уменьшить когнитивную сложность в этом блоке? Кстати, как это может быть больше разрешенных 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
для оценки.
Каждое объявление цикла 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
метод делает слишком много. Сделайте это более простым и разделите его. Это подход из чистого кода. Вы можете прочитать немного больше об этом здесь