Уменьшить когнитивную Сложность метода с 26 до 15.

У меня есть следующий код:

      private void generateKeyList(String pdm, List<Key> uKs,
                                 List<PhysicalKey> pKs) {
        if (pKs == null && uKs == null)
            return;
        JsonObject concepts = getConcepts(pdm);
        String indexTypeRequired = uKs == null ? "PRIMARY-KEY" : "UNIQUE";
        for (String concept : concepts.keySet()) {
            var indexes = concepts.getAsJsonObject(concept).getAsJsonArray("indexes");
            if (indexes == null)
                continue;
            for (JsonElement index : indexes) {
                JsonObject indexO = (JsonObject) index;
                var indexType = indexO.getAsJsonPrimitive("indexType").getAsString();
                var name = indexO.getAsJsonPrimitive("name").getAsString();
                var keys = indexO.getAsJsonArray("key").getAsJsonArray();
                if (indexType.equals(indexTypeRequired)) {
                    for (JsonElement indexKey : keys) {
                        var keyString = indexKey.getAsString();
                        var key = pKs == null ? new Key() : new PhysicalKey();
                        key.setName(name).setType(indexType).setTable(concept).setColumn(keyString);
                        if (uKs == null)
                            pKs.add((PhysicalKey) key);
                        else
                            uKs.add(key);
                    }
                }
            }
        }
    }

Я получаю сообщение от sonarLint о том, что когнитивная сложность этого кода равна 26, а она должна быть <=15.
Не знаю, как здесь уменьшить сложность.
Есть идеи подсказок?

1 ответ

Ниже я перечислил пару подсказок, основанных на вашем коде. Конечно, их гораздо больше. Вам может быть интересно прочитать книгу «Чистый код» Роберта Мартина.

  1. Извлеките код, который находится в циклах for, в отдельный метод (в вашем случае вы можете сделать это дважды)
  2. Извлеките код, который находится в условиях if или else, для разделения методов.
      if (condition){
   doSomething();
} else{
   doSomethingElse();
}
  1. Избегатьcontinue

Лучше изменить

      if (indexes == null)
                continue;

к

      if (indexes != null){
    for (JsonElement index : indexes) {...}
}
Другие вопросы по тегам