Статический анализ кода, часть 1. Основные метрики



Главная цель принципов разработки и паттернов проектирования — снизить стоимость разработки. Хорошим считается код, который легко:

🔸читать

🔸менять

🔸тестировать

🔸переиспользовать



Простота - субъективное понятие. Разработчику, который в проекте со дня основания, легко ориентироваться в коде и исправлять ошибки. Джуниор, который недавно пришёл и получил первое задание, вряд ли с ним согласится. К счастью, есть объективные показатели качества кода, которые можно отслеживать и анализировать. Их получают с помощью статического анализа на основе исходного и байт-кода. Базовых метрик больше 50, и обычно они группируются в 4 категории:



1️⃣ Связность (Cohesion)

Показывает, насколько сильно внутренние элементы взаимодействуют друг с другом, насколько сфокусирован класс.

В классе с низкой связностью много методов, которые мало взаимодействуют между собой:

class Программист {

void написатьКод()

void помытьПосуду()

void погладитьКота()

}

Идеальная сущность с точки зрения Cohesion - лямбда-выражение. Их легко читать, тестировать и переиспользовать.



2️⃣ Связанность (Coupling)

Показывает, как одна сущность взаимодействует с другими. Класс А связан с классом Б, если в классе А

▫️Поля класса Б

▫️Вызов методов класса Б

▫️Локальные переменные класса Б

▫️Если класс А - подкласс Б



В большинстве проектов есть модуль base или common - часто он является примером сильной связанности. Менять такой модуль - всегда большой риск.



3️⃣ Сложность (Complexity)

На этот показатель влияет:

▪️Сколько сущностей взаимодействуют

▪️Количество операций в методе

▪️Глубина наследования

▪️Количество ветвлений и возможных состояний



Показатель сложности часто идёт рука об руку с размером, но не всегда. Сложный метод может быть небольшим по размеру, но скрывать внутри себя десятки вариантов развития событий:

public void check(long id) {

dao.get(id).findProcessor()

.getAccount().checkBalance();

}



4️⃣ Размер (Size)

Большие сущности сложно поддерживать. В этой категории много метрик, например, количество:

🔹Полей

🔹Методов

🔹Статических методов

🔹Подклассов

🔹Связанных библиотек



А теперь ответы на вопросы перед постом:

Если класс А часто использует класс Б, то это признак высокой связанности. Связанность (coupling) характеризует внешние отношения между сущностями. Связность (cohesion) - про внутреннюю структуру самой сущности.

На сложность влияет количество ветвлений и глубина наследования. Остальные характеристики относятся к категории "размер".