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

Вы должны написать тело этой функции за пределами ready ();

, потому что ready используется для вызова функции или для привязки функции с идентификатором привязки, подобным этому.

$(document).ready(function() {
    $("Some id/class name").click(function(){
        alert("i'm in");
    });
});

, но вы не можете сделать это, если вызываете функцию «showAmount» по событию onchange / onclick

$(document).ready(function() {
    function showAmount(value){
        alert(value);
    }

});

Вы должны написать «showAmount» за пределами ready ();

function showAmount(value){
    alert(value);//will be called on event it is bind with
}
$(document).ready(function() {
    alert("will display on page load")
});
69
задан Michael Stum 26 May 2009 в 16:43
поделиться

11 ответов

Я не осознавая более глубокую концепцию. Я считаю, что это обычно рассматривается в контексте индекса ремонтопригодности. Чем больше ветвей внутри конкретного метода, тем труднее поддерживать мысленную модель работы этого метода (как правило).

Методы с более высокой цикломатической сложностью также труднее получить полное покрытие кода в модульных тестах. (Спасибо Mark W !)

Это, конечно же, включает все остальные аспекты ремонтопригодности. Вероятность ошибок / регрессов / пр. Однако основная концепция довольно проста.

52
ответ дан 24 November 2019 в 13:47
поделиться

Вроде того. Однако каждая ветвь оператора case или switch обычно считается за 1. Фактически это означает, что CC ненавидит операторы case и любой код, который их требует (командные процессоры, конечные автоматы и т. Д.) ).

1
ответ дан 24 November 2019 в 13:47
поделиться

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

1
ответ дан 24 November 2019 в 13:47
поделиться

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

Например:

function F:
    if condition1:
       ...
    else:
       ...
    if condition2:
       ...
    else:
       ...

Control Flow Graph

График потока управления

Вы, вероятно, интуитивно понимаете, почему связанный граф имеет цикломатическую сложность 3 .

1
ответ дан 24 November 2019 в 13:47
поделиться

Цикломатическая сложность на самом деле просто страшное модное слово. Фактически, это мера сложности кода, используемая при разработке программного обеспечения, чтобы указать на более сложные части кода (более вероятно, что они содержат ошибки, и поэтому должны быть очень тщательно и тщательно протестированы). Вы можете рассчитать его по формуле E-N + 2P, но я бы посоветовал вам рассчитать это автоматически с помощью плагина. Я слышал о практическом правиле, согласно которому вы должны стремиться поддерживать CC ниже 5, чтобы поддерживать хорошую читаемость и ремонтопригодность вашего кода.

Я недавно экспериментировал с Eclipse Metrics Plugin на моем Java проекты

3
ответ дан 24 November 2019 в 13:47
поделиться

Ага, это действительно так. Чем больше путей выполнения может занять ваш код, тем больше вещей необходимо проверить и тем выше вероятность ошибки.

7
ответ дан 24 November 2019 в 13:47
поделиться

Еще один интересный момент, который я слышал:

Места в вашем коде с самыми большими отступами должны иметь самый высокий CC. Как правило, это наиболее важные области для обеспечения покрытия тестированием, поскольку ожидается, что их будет труднее читать / поддерживать. Как отмечается в других ответах, это также более сложные области кода для обеспечения покрытия.

5
ответ дан 24 November 2019 в 13:47
поделиться

Каждая точка принятия решения в подпрограмме ( loop, switch, if и т.д ...) по существу сводится к эквиваленту оператора if. Для каждого , если у вас есть 2 пути кода, которые можно использовать. Итак, с 1-й веткой есть 2 пути кода, со второй - 4 возможных пути, с 3-й - 8 и так далее. Существует не менее 2 ** N кодовых путей, где N - количество ветвей.

Это затрудняет понимание поведения кода и его тестирование, когда N превышает некоторое небольшое число.

2
ответ дан 24 November 2019 в 13:47
поделиться

Википедия может быть вашим другом по этому вопросу: Определение цикломатической сложности

По сути, вы должны представить свою программу как элемент управления потоковый граф , а затем

Сложность (...) определяется как:

 M = E - N + 2P

где

  • M = цикломатическая сложность,
  • E = количество ребер графа
  • N = количество узлов графа
  • P = количество связанных компонентов

CC это концепция, которая пытается зафиксировать, насколько сложна ваша программа и насколько сложно ее протестировать, с помощью одного целого числа.

11
ответ дан 24 November 2019 в 13:47
поделиться

Цикломатическая сложность измеряет количество раз, которое вы должны выполнить блок кода с различными параметрами, чтобы выполнить каждый путь через этот блок. Более высокое количество - плохо, потому что это увеличивает шансы на то, что логические ошибки ускользнут от вашей стратегии тестирования.

38
ответ дан 24 November 2019 в 13:47
поделиться

Вот и все, идея состоит в том, что метод с низким CC имеет меньше вилок, циклов и т. Д., Что делает метод более сложным. Представьте, что вы просматриваете 500 000 строк кода с помощью анализатора и видите пару методов, у которых CC намного выше. Это позволяет вам затем сосредоточиться на рефакторинге этих методов для лучшего понимания (также часто бывает, что высокий CC имеет высокий уровень ошибок)

2
ответ дан 24 November 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: