Введение
Мера структурной сложности программного обеспечения.
Cyclomatic complexity is a software metric used to indicate the complexity of a program. It is a quantitative measure of the number of linearly independent paths through a program's source code. It was developed by Thomas J. McCabe, Sr. in 1976. Cyclomatic complexity is computed using the control flow graph of the program. The nodes of the graph correspond to indivisible groups of commands of a program, and a directed edge connects two nodes if the second command might be executed immediately after the first command. Cyclomatic complexity may also be applied to individual functions, modules, methods, or classes within a program. One testing strategy, called basis path testing by McCabe who first proposed it, is to test each linearly independent path through the program. In this case, the number of test cases will equal the cyclomatic complexity of the program.
Цикломатическая сложность – это программная метрика, используемая для оценки сложности программы. Это количественная мера числа линейно независимых путей в исходном коде программы. Она была разработана Томасом Дж. Маккейбом-старшим в 1976 году. Цикломатическая сложность вычисляется на основе графа потока управления программы. Узлы графа соответствуют неделимым блокам команд программы, а направленное ребро соединяет два узла, если вторая команда может быть выполнена непосредственно после первой. Цикломатическая сложность может также применяться к отдельным функциям, модулям, методам или классам внутри программы. Одна из стратегий тестирования, предложенная Маккейбом и называемая тестированием базовых путей, заключается в тестировании каждого линейно независимого пути в программе. В этом случае количество тестовых случаев будет равно цикломатической сложности программы.
Cyclomatic complexity is a software metric used to indicate the complexity of a program. It is a quantitative measure of the number of linearly independent paths through a program's source code. It was developed by Thomas J. McCabe, Sr. in 1976. Cyclomatic complexity is computed using the control flow graph of the program. The nodes of the graph correspond to indivisible groups of commands of a program, and a directed edge connects two nodes if the second command might be executed immediately after the first command. Cyclomatic complexity may also be applied to individual functions, modules, methods, or classes within a program. One testing strategy, called basis path testing by McCabe who first proposed it, is to test each linearly independent path through the program. In this case, the number of test cases will equal the cyclomatic complexity of the program.
Ограничение сложности в процессе разработки
Одним из первоначальных применений метода Маккейба было ограничение сложности подпрограмм в процессе разработки программы. Он рекомендовал программистам вычислять сложность разрабатываемых модулей и разделять их на более мелкие, если цикломатическая сложность модуля превышала 10.
Измерение "структурированности" программы
Раздел VI статьи Маккейба 1976 года посвящен определению структуры графов потока управления (CFG) неструктурированных программ с точки зрения подграфов, выделенных Маккейбом. (Подробности см. в теореме о структурированных программах.) Маккейб завершил этот раздел, предложив численную оценку близости программы к идеалу структурированного программирования, то есть ее "структурированности". Маккейб назвал разработанную им меру "существенной сложностью". Если программа структурирована, то процесс редукции/конденсации Маккейба сводит ее к единственному узлу CFG. В отличие от этого, если программа неструктурирована, итеративный процесс выявит ее необратимую часть. Мера существенной сложности, предложенная Маккейбом, представляет собой просто цикломатическую сложность этого необратимого графа, поэтому она будет равна 1 для всех структурированных программ, но больше единицы для неструктурированных программ. Некоторые исследования выявили положительную корреляцию между цикломатической сложностью и дефектами: функции и методы с наибольшей сложностью, как правило, содержат больше всего дефектов. Однако многократно демонстрировалась корреляция между цикломатической сложностью и размером программы (обычно измеряемым в строках кода). Лес Хэттон утверждал, что сложность обладает такой же прогностической силой, как и количество строк кода. Исследования, контролирующие размер программы (то есть сравнивающие модули с разной сложностью, но схожим размером), как правило, дают менее однозначные результаты: многие из них не обнаруживают значимой корреляции, в то время как другие – обнаруживают. Некоторые исследователи ставят под сомнение достоверность методик, использованных в исследованиях, не выявивших корреляции. Хотя эта взаимосвязь, вероятно, существует, ее сложно применить на практике. Поскольку размер программы не является контролируемым параметром коммерческого программного обеспечения, полезность числа Маккейба подвергается сомнению.