Уменьшить когнитивную Сложность метода с 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 ответ
Ниже я перечислил пару подсказок, основанных на вашем коде. Конечно, их гораздо больше. Вам может быть интересно прочитать книгу «Чистый код» Роберта Мартина.
- Извлеките код, который находится в циклах for, в отдельный метод (в вашем случае вы можете сделать это дважды)
- Извлеките код, который находится в условиях if или else, для разделения методов.
if (condition){
doSomething();
} else{
doSomethingElse();
}
- Избегать
continue
Лучше изменить
if (indexes == null)
continue;
к
if (indexes != null){
for (JsonElement index : indexes) {...}
}