Наиболее распространенными метриками для измерения сложности (или простоты, если принять простоту за противоположность сложности) являются цикломатическая сложность МакКейба и метрики сложности Холстеда .
Цикломатическая сложность измеряет количество различных путей в данной единице, обычно в методе или функции, хотя она также может быть вычислена в классе. По мере увеличения числа путей становится все труднее запоминать поток данных через данный модуль, что связано с концепцией рабочей памяти . Высокая цикломатическая сложность имеет тенденцию указывать на трудность в способности тестировать модуль - требуется больше тестовых случаев, чтобы покрыть различные пути через систему. Также были исследования, которые связывают высокую цикломатическую сложность с высокой частотой дефектов. Как правило, цикломатическая сложность 10 указывает на то, что единица должна быть проверена и, возможно, подвергнута рефакторингу.
Меры сложности Холстеда используют входные данные от общих и различных операторов и операндов для вычисления объема, сложности и усилия фрагмента кода. Сложность, которая представляет собой (количество уникальных операторов / 2) * (общее количество операндов / количество уникальных операндов), связана со способностью читать и понимать код для таких задач, как изучение системы или выполнение обзора кода. Опять же, вы можете посчитать это на системном уровне, уровне класса или уровне метода / функции. Есть несколько сообщений о том, как вычислить эти измерения здесь и здесь .
Простой подсчет строк кода также может дать представление о сложности. Больше строк кода означает, что в модуле есть что читать и понимать. Я не хотел бы использовать это как отдельное измерение. Вместо этого я бы использовал его с другими измерениями, такими как количество дефектов в данном модуле, чтобы получить плотность дефектов. Высокая плотность дефектов может указывать на проблемы при написании тестов и выполнении проверок кода, которые могут быть или не быть вызваны сложным кодом.
Разветвление и разветвление - это две другие метрики, связанные с потоком данных. Как определено здесь , fan in - это сумма вызванных процедур, считывание параметров, а считывание глобальных переменных и разветвление - это сумма процедур, вызывающих данную процедуру, записанных параметров (представленных внешним пользователям, переданных по ссылке), и глобальные переменные, записанные в. Опять же, высокий уровень разветвления и разветвления может указывать на модуль, который может быть трудным для понимания.
В определенных парадигмах могут быть другие меры или метрики, которые также полезны. Например, в объектно-ориентированном мире для оценки того, насколько проста или сложна система, можно использовать связывание мониторинга (желание меньше), сплоченность (желание высоко) и глубину наследования (желание низко).
Конечно, важно понимать, что многие показатели и показатели являются просто показателями. Вы должны использовать свое суждение, чтобы определить, нужно ли проводить рефакторинг для увеличения простоты или не стоит ли это делать. Вы можете выполнять измерения, вычислять метрики и узнавать о своем коде, но вы не хотите проектировать свою систему по числам. В конечном счете, делать то, что имеет смысл.