Статьи

Цикломатическая сложность

Цикломатическая сложность — метрика, измеряющая количество путей выполнения кода и используется для оценки сложности кодовой базы. Она представляет собой количество линейно независимых путей в графе потока управления, который может быть представлен в виде графа, где вершины обозначают участки кода, а ребра — переходы между ними. Звучит довольно сложно?

Разберемся на конкретных примерах:

1. Большое количество вложенных операторов if/else

def check_args (x, y, z):

if x > 10:

if y > 5:

if z > 2:

print («Все условия выполнены»)

else:

print («Валидация не пройдена!»)

else:

print («Валидация не пройдена!»)

else:

print («Валидация не пройдена!»)

В данном примере присутствует три вложенных оператора if/else, что делает код менее понятным и увеличивает его сложность. Правильный способ решения данной задачи — использование логического оператор and.

def check_args (x, y, z):

if x > 10 and y > 5 and z > 2:

print («Все условия выполнены»)

else:

print («Один из переданных аргументов не соответствует требованиям»)

В случае, если мы возвращаем результат выполнения функции, то можно избавиться и от блока else.

def check_args (x, y, z):

if x > 10 and y > 5 and z > 2:

return True

return False

2. Большое количество вложенных циклов

for i in range (10):

for j in range (10):

for k in range (10):

# do something

В данном примере используется три вложенных цикла, что также делает код менее эффективным и увеличивает его сложность. Здесь оптимальным способом решения выступает использование функции itertools.product.

import itertools

for i, j, k in itertools. product (range (10), repeat=3):

# do something

Разумеется, примеры демонстрируют лишь верхушку айсберга, но умение распознать проблему — уже половина на пути к её решению.

Полный список факторов, влияющих на повышение ЦС:

1. Использование вложенных циклов

2. Применение условных операторов с большим количеством ветвлений

3. Использование длинных функций или методов с множеством ветвлений

4. Использование генераторов случайных чисел

5. Множественное применение рекурсии

6. Использование сложных алгоритмов или структур данных

7. Несоблюдение принципа единственной ответственности при проектировании классов или функций

8. Использование множества операторов return в одной функции

Частый кейс у начинающих разработчиков, когда в коде встречается комбинация из вышеперечисленных факторов. Разумеется, отслеживать отсутствие ошибок, повышающих ЦС, может быть довольно сложно, и тут на помощь приходят сервисы вроде CodeClimate. Они предоставляют комплексный анализ кода, помогая разработчику провести эффективный рефакторинг. В заключение хочется сказать, что тема ЦС достойна изучения, а понимание всех ее принципов и практик ведет к написанию по-настоящему качественного и читаемого кода.
Профильные статьи