Cyclomatic Complexity — это программный показатель, полезный для структурированного тестирования или тестирования White Box . Если программа имеет большое число сложности, то вероятность ошибки высока с увеличением времени на обслуживание и устранение неисправностей. Цикломатическая сложность программы (Cyclomatic complexity of a program) структурная (или топологическая) мера сложности программ, для измерения качества программного обеспечения. Измерение цикломатической сложности позволяет оценить качество программного кода и выявить процедуры с повышенной сложностью. Процедуры с повышенной сложностью подвержены ошибкам и их выявление крайне желательно для проведения их аудита (code review). Цикломатическая сложность программы была первой из топологических мер сложности, применялась на практике и послужила основой для многих модификаций.
Считается, что цикломатическая сложность в идеале не должна превышать 10. В гайдах по качеству кода, например Microsoft, особо подчеркивается, что высокая ЦС чревата ошибками (то есть багами). Анализаторы кода в IDE-редакторе отправляют разработчику (автоматическое) уведомление, если ЦС превысила пороговое значение (по дефолту 25, но можно настроить и ниже/выше). В этом случае исправление было простым – у сопрограммы есть набор задач, поэтому я разбиваю эти задачи на более мелкие сопрограммы и заменяю основной метод вызовами подпрограмм. Общий код не изменился, как и общая сложность самого класса, но теперь основная функция – это не чудовище из 400 строк. Часто при редактировании кода можно учитывать цикломатическую сложность, даже указывая на проблемные функции, которые могут потребовать ручной доработки.
Если смотреть по показателю когнитивной сложности, то у Си-подобных языков получается средняя сложность кода около 25, в то время как все остальные ЯП — в среднем 15. Поэтому в 2017 одной небольшой компанией была предложена концепция когнитивной сложности кода (то есть сложности восприятия человеком и как следствие сложности в обслуживании и тестировании), и, как заявляется, такой код будет гораздо лучше. Концепция ЦС впервые описана в 1970х Томасом Маккейбом (поэтому называется еще «сложностью программы по Маккейбу») в книге о структурном тестировании и создании правильных тест-кейсов. Цикломати́ческая сло́жность програ́ммы (англ. cyclomatic complexity of a program) — структурная (или топологическая) мера сложности компьютерной программы. Вторая задача Guard Expression — сразу же обработать пограничные случаи. Речь идет о дополнительных проверках, которые могут усложнить и удлинить код, но не позволят функции или программе выполняться при определенных условиях.
Цикломатическая сложность – это измерение сложности исходного кода, которое коррелируется с рядом ошибок кодирования. Он рассчитывается путем разработки графика потока управления кода, который измеряет количество линейно-независимых путей через программный модуль. Чтобы вычислить эту меру, исходный CFG итеративно сокращается путем определения подграфов, которые имеют точку с одним входом и точку с одним выходом, которые затем заменяются одним узлом.
Корреляция Числа Дефектов
В какой-то мере читаемость зависит от самого языка, например, код на HTML или SQL явно лучше читается человеком, чем на C++ или Java. При этом отличают необходимую сложность кода (которую никак нельзя устранить, из-за специфики языка, или специфики самой программы) и непреднамеренную, которая может и должна быть успешно устранена/существенно снижена создателем кода, или код-ревьюером. Другое применение цикломатической сложности — определение количества тестов, необходимых для полного покрытия кода.
Цикломатическая сложность участка кода – это количественная мера количества линейно независимых путей в нем. Это программный показатель, используемый для обозначения сложности программы. Узлы на графе указывают наименьшую группу команд программы, а направленное ребро в ней соединяет два узла, т.е.
Частично оценить их позволяет цикломатическая сложность — количество линейно независимых маршрутов через программный код. Если исходный код не содержит никаких точек ветвления или циклов, то сложность равна единице, поскольку есть только один маршрут следования через код. Но в ситуации, когда используются условия и циклы, цикломатическая сложность будет выше единицы. https://deveducation.com/ Цикломатическая сложность части программного кода — количество линейно независимых маршрутов через программный код. Если исходный код не содержит никаких точек ветвления или циклов, то сложность равна единице, поскольку есть только один маршрут через код. ЦИКЛОМАТИЧЕСКАЯ СЛОЖНОСТЬ — это метрика программного обеспечения, используемая для измерения сложности программы.
Независимый путь определяется как путь, имеющий хотя бы одно ребро, которое ранее не проходило ни в одном другом пути. Цикломатическая сложность может быть рассчитана относительно функций, модулей, методов или классов в программе. Цикломатическая сложность — показатель сложности исходного кода программы, который связан (коррелирует) с вероятностью возникновения ошибок (багов) в программе.
Полезности Показателя Цикломатической Сложности В Разработке И Qa
Мы также рассмотрим, насколько он полезен в качестве метрики для измерения сложности вашего кода. МакКейбом в 1976 году и основана на представлении программы потока управления. Поток управления изображает программу в виде графика, который состоит из узлов и ребер.
Расчет цикломатической сложности относится к методам статического анализа кода. Цикломатическая сложность программного кода является одной из наиболее старых метрик, впервые она была упомянута в 1976 году Томасом МакКэбом. Цикломатическая сложность показывает минимальное число cyclomatic complexity это необходимых тестов. Наиболее эффективным способом снижения цикломатической сложности является декомпозиция кода, дробление методов на более простые, а также оптимизация логических выражений. К сожалению, не всегда удобно проверять все возможные пути прохождения программы.
Цикломатическая сложность используется в качестве одного из параметров в индексе удобства сопровождения (англ. maintainability index)[6].
Что Такое Цикломатическая Сложность?
Иногда — в силу особенностей писавшего ее программиста (случайная сложность). И хотя нельзя однозначно описать эту сложность, существуют способы, позволяющие хотя бы частично ее оценить. Цикломатическая сложность может быть рассчитана вручную, если программа небольшая.
Многие IDE, такие как Visual Studio, будут иметь встроенные инструменты для расчета цикломатической сложности и других показателей кода для всей базы кода. Visual Studio и другие IDE рассчитывают общую сложность целых классов и пространств имен, что может быть полезно для поиска самых сложных классов. Вы можете сортировать по высшей сложности и исследовать отдельные функции. Условие “вернуть null, если младше 18 лет” гораздо более простое и очевидное. Этим можно воспользоваться и произвести рефакторинг (улучшение работающего кода без изменения функциональности) таким образом, чтобы это условие отрабатывало первым. Иногда так происходит в силу объективных причин (необходимая сложность).
- Должны учитываться в терминах задействованных переменных предиката, то есть в этом примере нужно подсчитывать две точки принятия решения, потому что на машинном уровне это эквивалентно IF cond1 THEN IF cond2 THEN …
- Допустим, тест применяется каждый раз для единственного маршрута, тогда необходимое количество раз применений теста определяется числом покрытия, равного числу путей, которые действительно могут быть использованы при работе программы.
- Это определение может рассматриваться как вычисление числа линейно независимых циклов, которые существуют в графе, то есть тех циклов, которые не содержат в себе других циклов.
- В примере выше у функции sum цикломатическая сложность равна единице, а у функции abs — двойке, так как она содержит ветвление, а значит два независимых пути выполнения.
- Если программа структурирована, то процесс редукции / уплотнения МакКейба сводит ее к одному узлу CFG.
Цикломатическая сложность — это структурная или топологическая мера сложности компьютерной программы, разработанная Томасом Дж. Измерение — это не что иное, как количественное указание размера / размера / емкости атрибута продукта / процесса. Метрика программного обеспечения определяется как количественная мера атрибута, которым обладает система программного обеспечения в отношении стоимости, качества, размера и графика.
Раздел VI статьи МакКейба 1976 года посвящен определению того, как выглядят графы потока управления (CFG) неструктурированных программ в терминах их подграфов, которые МакКейб идентифицирует. Маккейб назвал изобретенную для этой цели меру существенной сложностью . Даже подграф графа (также известный как эйлеровый подграф ) является одним , где каждая вершина падает с четным числом ребер; такие подграфы представляют собой объединение циклов и изолированных вершин. В дальнейшем четные подграфы будут отождествляться с их наборами ребер, что эквивалентно рассмотрению только тех четных подграфов, которые содержат все вершины полного графа.
Чем больше возможных путей выполнения, тем сложнее функцию понять, отладить и модифицировать. Очевидно, что, с одной стороны, функции нужно дробить, а с другой — описывать логику программы так, чтобы не появлялись лишние пути. Допустим, тест применяется каждый раз для единственного маршрута, тогда необходимое количество раз применений теста определяется числом покрытия, равного числу путей, которые действительно могут быть использованы при работе программы. Другое применение цикломатической сложности — при детерминизме числа проведённых тестов, необходимых для достижения тщательного покрытия тестированием модуля. Это другой способ сказать «число линейно независимых маршрутов через граф от входа к выходу».
Хотя высокая цикломатическая сложность какой-либо функции не может быть концом света, это может быть признаком более серьезной проблемы. Функции высокой сложности труднее поддерживать и подвержены большему количеству ошибок, потому что есть еще много ошибок. А функции более высокой сложности напрямую приводят к более сложным модульным тестам, что может затруднить поддержку кода в долгосрочной перспективе из-за сложности тестирования.
Рассматривая приведенный выше пример, каждый раз, когда добавляется дополнительный оператор if-then-else, количество возможных путей увеличивается в 2 раза. По мере того, как программа растет таким образом, она быстро достигает точки, когда проверка всех путей становится непрактично. В общем, чтобы полностью протестировать модуль, должны быть проверены все пути выполнения через модуль. Это означает, что для модуля с высоким числом сложности требуется больше усилий по тестированию, чем для модуля с более низким значением, поскольку более высокое число сложности указывает на большее количество путей прохождения кода. Это также означает, что модуль с более высокой сложностью труднее понять программисту, поскольку программист должен понимать различные пути и результаты этих путей. В этом примере двух тестовых примеров достаточно для достижения полного покрытия ветки, а четырех необходимо для полного покрытия пути.
Показатель цикломатической сложности вычисляется через граф потока управления (Control flow graph, CFG), который отображает количество линейно-независимых путей выполнения (как это?) в программе. Однако это верно только для точек принятия решения, подсчитываемых в самых нижних командах машинного уровня. Решения, включающие составные предикаты, подобные тем, которые встречаются в языках высокого уровня, например, IF cond1 AND cond2 THEN … Должны учитываться в терминах задействованных переменных предиката, то есть в этом примере нужно подсчитывать две точки принятия решения, потому что на машинном уровне это эквивалентно IF cond1 THEN IF cond2 THEN … Цикломатическая сложность – это программный показатель, используемый для обозначения сложности программы . Это количественная мера количества линейно независимых путей в исходном коде программы .
Если функция вызывает другую функцию с высокой цикломатической сложностью, она считается только одним узлом и ничего не добавляет вызывающему, несмотря на то, что технически усложняет программу в общем смысле. Этот код, который содержит switch инструкция, имеет сложность 6, потому что код может принимать много разных путей. Каждый case в операторе swap добавляет сложности, так как это может привести к разным выходам с разными входами. Цикломатическая сложность в основном измеряет количество ветвей в вашем коде. Всякий раз, когда есть if инструкции или другого блока управления, такого как цикл, цикломатическая сложность возрастает, так как граф будет все больше и больше походить на дерево. Где π – количество точек принятия решения в программе, а s – количество точек выхода.
Для примера рассмотрим нижеприведённую программу, состоящую из последовательного применения двух операторов if-then-else. Но некоторые пути могут быть невозможными, так что, число путей через КПГ — это, несомненно, верхняя граница числа тестов, для обеспечения покрытия пути (возможного пути), чей номер идёт последним, которое иногда может быть меньше чем M. Показатель ЦС имеет большое значение в тестировании, потому что он примерно показывает количество тестов, необходимых для полного покрытия кода. Например, рассмотрим программу, состоящую из двух последовательных операторов if-then-else.