7/24 Arayınız +90 532 610 63 77

Плюсы И Минусы Цикломатической Сложности Как Показателя

При этом отличают необходимую сложность кода (которую никак нельзя устранить, из-за специфики языка, или специфики самой программы) и непреднамеренную, которая может и должна быть успешно устранена/существенно снижена создателем кода, или код-ревьюером. При тестировании белого ящика, когда желательно (или обязательно) проверить каждый оператор в модуле как минимум по одному разу. Количество тест-кейсов прямо коррелирует с цикломатической сложностью в том смысле, что количество тест-кейсов при таком подходе равно цикломатической сложности модуля.

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

Поэтому в 2017 одной небольшой компанией была предложена концепция когнитивной сложности кода (то есть сложности восприятия человеком и как следствие сложности в обслуживании и тестировании), и, как заявляется, такой код будет гораздо лучше. В графе узлы (или ноды, nodes), обозначают задачи (processing tasks), а рёбра обозначают пути выполнения (control flow). » Я говорю себе, пытаясь отрицать, что код, который я написал, математически плох, настолько, что Visual Studio выдает предупреждение. По большей части, сложность от 6 до eight вполне подойдет, если сам код хорошо отформатирован. Все, что выше 8-15, сомнительно, а все, что больше 15, вероятно, не очень хорошо.

Visual Studio и другие IDE рассчитывают общую сложность целых классов и пространств имен, что может быть полезно для поиска самых сложных классов. Вы можете сортировать по высшей сложности и исследовать отдельные функции. Наряду со сложностью Visual Studio также представляет «индекс ремонтопригодности», который оценивает метод от 0 до one hundred и выше, легкость его обслуживания, а также «связь классов», в котором указано, на сколько классов ссылается эта функция или класс. Часто проверка кода может учитывать цикломатическую сложность, даже помечая проблемные функции, которые могут потребовать ручной проверки.

Измерение «структурированности» Программы

Существенная мера сложности, определенная МакКейбом, – это просто цикломатическая сложность этого неприводимого графа, поэтому она будет в точности 1 для всех структурированных программ, но больше единицы для неструктурированных программ. Это определение может рассматриваться как вычисление числа линейно независимых циклов, которые существуют в графе, то есть тех циклов, которые не содержат в себе других циклов. Так как каждая точка выхода соединена с точкой входа, то существует по крайней мере один цикл для каждой точки выхода. В общем, чтобы полностью протестировать модуль, должны быть проверены все пути выполнения через модуль. Это означает, что для модуля с высоким числом сложности требуется больше усилий по тестированию, чем для модуля с более низким значением, поскольку более высокое число сложности указывает на большее количество путей прохождения кода.

Ниже приводятся блок-схемы для операторов типа if-else, while, whereas и нормальной последовательности потоков. Это соответствие характеризуется цикломатической сложностью как «количество циклов плюс количество компонентов». Наряду со сложностью Visual Studio также имеет «Индекс ремонтопригодности», который дает методу высокий балл от zero до a hundred, а также «Связывание классов», в котором указано количество классов, на которые ссылается эта функция или класс. Многие IDE, такие как Visual Studio, будут иметь встроенные инструменты для расчета цикломатической сложности и других показателей кода для всей базы кода. Откроется панель «Метрики кода», на которой будет показана разбивка вашего решения. Вы можете отсортировать по сложности в порядке убывания, чтобы просмотреть наиболее проблемные пространства имен.

Все, что старше 25, почти наверняка является проблемой, если не доказано обратное. » Я говорю себе, пытаясь отрицать, что код, который я написал, математически плох, до такой степени, что Visual Studio выдает предупреждение. По большей части сложность от 6 до 8 https://deveducation.com/, вероятно, хороша, если сам код хорошо отформатирован. Все, что от 8 до 15, сомнительно, а все, что больше 15, вероятно, не очень хорошо. Все, что больше 25, почти наверняка является проблемой, если не доказано обратное.

  • Другое применение цикломатической сложности — при детерминизме числа проведённых тестов, необходимых для достижения тщательного покрытия тестированием модуля.
  • Цикломатическая сложность в основном измеряет количество ветвлений вашего кода.
  • По большей части сложность от 6 до 8, вероятно, хороша, если сам код хорошо отформатирован.
  • Хотя это и не точная наука, она позволяет получить общее представление о сложности функций, классов и пространств имен, что может быть полезно при поиске кода для рефакторинга.
  • Стоит отметить, что этот текст предназначен для тех, кто уже умеет создавать функции.
  • Это сокращение соответствует тому, что сделал бы человек, если бы он извлек подпрограмму из более крупного фрагмента кода.

ЦСП равна увеличенному на единицу цикломатическому числу графа программы. Конечно, у вас все еще может быть ужасный код с низкой сложностью или достойный код с высокой сложностью. Но в целом получить общее представление о сложности программы все же очень полезно. Хотя высокая цикломатическая сложность любой данной функции не является концом света, она может указывать на более серьезную проблему.

Общий код не изменился, как и общая сложность самого класса, но теперь основная функция не является чудовищем из four hundred строк. Этот код, содержащий оператор change , имеет сложность 6, потому что существует много разных путей, по которым может идти код. Каждый case в операторе change усложняет задачу, поскольку может привести к разным результатам при разных входных данных.

Формальное Определение[править Править Код]

Это также означает, что модуль с более высокой сложностью труднее понять программисту, поскольку программист должен понимать различные пути и результаты этих путей. В этом примере двух тестовых примеров достаточно для достижения полного покрытия ветки, а четырех необходимо для полного покрытия пути. Цикломатическая сложность программы составляет three (поскольку сильно связный граф для программы содержит 9 ребер, 7 узлов и 1 компонент связности) (9-7 + 1).

Он производил непосредственные численные измерения для линейно независимых путей в исходных кодах программ. Концепция, но не метод, отчасти похож на измерение сложности с помощью теста удобочитаемости Флеша-Кинкейда (англ.) для общего текста. Другое применение цикломатической сложности — определение количества тестов, необходимых для полного покрытия кода. Цикломатическая сложность — это метрика кода, которую можно просмотреть во многих интегрированных средах разработки, таких как Visual Studio. Хотя это и не точная наука, она позволяет получить общее представление о сложности функций, классов и пространств имен, что может быть полезно при поиске кода для рефакторинга. К сожалению, не всегда удобно проверять все возможные пути прохождения программы.

Если смотреть по показателю когнитивной сложности, то у Си-подобных языков получается средняя сложность кода около 25, в то время как все остальные ЯП — в среднем 15. Где E — количество рёбер, N — количество узлов, P — количество предикативных узлов (то есть узлов, содержащих условие). Концепция ЦС впервые описана в 1970х Томасом Маккейбом (поэтому называется еще «сложностью программы по Маккейбу») в книге о структурном тестировании и создании правильных тест-кейсов. Цикломати́ческая сло́жность програ́ммы (англ. cyclomatic complexity of a program) — структурная (или топологическая) мера сложности компьютерной программы. Откроется панель «Показатели кода», на которой будет представлена ​​разбивка вашего решения. Вы можете отсортировать по сложности в порядке убывания, чтобы отобразить наиболее проблемные пространства имен.

В дальнейшем четные подграфы будут отождествляться с их наборами ребер, что эквивалентно рассмотрению только тех четных подграфов, которые содержат все вершины полного графа. Где π – количество точек принятия решения в программе, а s – количество точек выхода. Но некоторые пути могут быть невозможными, так что, число путей через КПГ — это, несомненно, верхняя граница числа тестов, для обеспечения покрытия пути (возможного пути), чей номер идёт последним, которое иногда может быть меньше чем M. Показатель ЦС имеет большое значение в тестировании, потому что он примерно показывает количество тестов, необходимых для полного покрытия кода. Visual Studio и другие IDE вычисляют совокупную сложность целых классов и пространств имен, что может быть полезно для отслеживания наиболее сложных классов.

Поскольку это просто идеально линейный код, количество узлов сократит количество ребер, давая цикломатическую сложность, равную единице. Цикломатическая сложность в основном измеряет количество ветвей в вашем коде. Всякий раз, когда есть if инструкции или другого блока управления, такого как цикл, цикломатическая сложность возрастает, так как граф будет все больше и больше походить на дерево. Раздел VI статьи МакКейба 1976 года посвящен определению того, как выглядят графы потока управления (CFG) неструктурированных программ в терминах их подграфов, которые МакКейб идентифицирует. Маккейб назвал изобретенную для этой цели меру существенной сложностью . В этом случае исправить было просто — у сопрограммы есть куча задач, поэтому я разбиваю эти задачи на более мелкие сопрограммы и заменяю основной метод вызовами подпрограмм.

Соотношение Количества Дефектов

В гайдах по качеству кода, например Microsoft, особо подчеркивается, что высокая ЦС чревата ошибками (то есть багами). Анализаторы кода в IDE-редакторе отправляют разработчику (автоматическое) уведомление, если ЦС превысила пороговое значение (по дефолту 25, но можно настроить и ниже/выше). В этом случае исправление было простым – у сопрограммы есть набор задач, поэтому я разбиваю эти задачи на более мелкие сопрограммы и заменяю основной метод вызовами подпрограмм. Общий код не изменился, как и общая сложность самого класса, но теперь основная функция – это не чудовище из 400 строк. Часто при редактировании кода можно учитывать цикломатическую сложность, даже указывая на проблемные функции, которые могут потребовать ручной доработки. Это может сделать его очень полезным инструментом для поддержания чистой и аккуратной базы кода.

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

Это количественная мера количества линейно независимых путей в исходном коде программы . Тестирование базового пути является одним из методов «белого ящика» и гарантирует выполнение хотя бы одного оператора во время тестирования. Он проверяет каждый линейно независимый путь в программе, что означает , что число тестовых примеров будет эквивалентно цикломатической сложности программы. При вычислении цикломатической сложности используется граф потока управления программы.

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

Рассматривая приведенный выше пример, каждый раз, когда добавляется дополнительный оператор if-then-else, количество возможных путей увеличивается в 2 раза. По мере того, как программа растет таким образом, она быстро достигает точки, когда проверка всех путей становится непрактично. Это можно рассматривать как вычисление количества линейно независимых циклов , существующих в графе, то есть тех циклов, которые не содержат других циклов внутри себя. Обратите внимание, что поскольку каждая точка выхода возвращается к точке входа, существует по крайней мере один такой цикл для каждой точки выхода. Большая цикломатическая сложность программы (модуля) как правило означает запутанность кода, и повышение риска ошибок при модификации кода. Хотя высокая цикломатическая сложность какой-либо функции не может быть концом света, это может быть признаком более серьезной проблемы.

Вторая задача Guard Expression — сразу же обработать пограничные случаи. Речь идет о дополнительных проверках, которые могут усложнить и удлинить код, но не позволят функции или программе выполняться при определенных условиях. Цикломатическая сложность также может использоваться для оценки семантической сложности программ искусственного интеллекта. Это соответствует описанию цикломатической сложности как «количество петель плюс количество компонентов». Это соответствует интуитивному представлению о цикломатической сложности и может быть рассчитано, как указано выше. Этот пример ясно показывает, что более низкая цикломатическая сложность не всегда соответствует «лучшему коду».

Цикломатическая сложность оказалась полезной в географическом и ландшафтно-экологическом анализе после того, как было показано, что ее можно реализовать на графиках ультраметрических расстояний. Как только базовый набор сформирован, должны быть записаны тестовые случаи для выполнения всех путей. Следующие шаги должны быть выполнены для вычисления Cyclomatic сложности и разработки тестовых случаев. Линейно-независимый путь выполнения определяется Маккейбом как путь, имеющий хотя бы одно ребро, которое не было пройдено перед тем любыми другими путями выполнения.

Вы можете сортировать по наибольшей сложности и детализировать отдельные функции. Guard Expression — подход, который в некоторых случаях помогает снизить уровень вложенности функции и сэкономить ресурсы — сделать так, чтобы программа не выполнялась при пограничных случаях. На примерах разбираем, в чем суть подхода и в каких случаях его можно применять.

На графах демонстрируется в наглядном виде выполнение программы (обычно выполнение ее отдельного модуля, поскольку граф всей программы выглядел бы слишком большим и запутанным). — оценку снизу количества «маршрутов» через граф потока управления и, таким образом, количества тестов для полного покрытия путей. Но, в целом, это все еще весьма полезно для получения общего представления о том, cyclomatic complexity это насколько сложна программа. Если функция вызывает другую функцию с высокой цикломатической сложностью, она считается только одним узлом и ничего не добавляет к вызывающей стороне, несмотря на то, что технически усложняет программу в общем смысле. Например, этот код имеет цикломатическую сложность, равную единице, поскольку в нем нет ветвей, и он просто снова и снова вызывает WriteLine.

Bir yanıt yazın

Note: Comments on the web site reflect the views of their authors, and not necessarily the views of the bookyourtravel internet portal. Requested to refrain from insults, swearing and vulgar expression. We reserve the right to delete any comment without notice explanations.

Your email address will not be published. Required fields are signed with *