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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку цикломатическая сложность оценивается по количеству ключевых слов "если, переключиться, пока для паузы" и т. д. все инструменты, которые работают с C, будут выполнять свою работу, например sourcemonitor: http://www.campwoodsw.com/sourcemonitor.html
На самом деле, в javascript, чем больше вы пытаетесь модулировать свой код, тем больше вы его замедляете, так что относитесь к нему с недоверием;)
Обновлено: Я Действительно не могу понять, что происходит в этом ответе, я получаю еще один отрицательный голос, когда в своем ответе я говорю хороший инструмент для расчета цикломатической сложности в javascript, и это, в частности, очень хорошо работает.
Ко второму утверждению мой комментарий основан на опыте, я никогда не говорю не модулируйте свой js-код, я говорю только обращай внимание на это, потому что часто есть компромисс со скоростью, и когда я говорю о скорости, я имею в виду, что могут произойти два разных замедления: время загрузки и время исполнения (а в медленных устройствах, таких как КПК / смартфон, это важно).
Поскольку подобные инструменты часто побуждают разработчика писать больше кода, пытаясь добиться меньшего возможного индекса, но в js больший объем кода, к сожалению, означает, что могут произойти замедления, а злоупотреблять этих инструментов плохой. Конечно, эти инструменты могут дать вам подсказку о том, что куда ваш код может быть улучшен, но вы должны научиться использовать этот инструмент, а не слепо полагаться на него.
Поэтому, если вы снова проголосуете против меня, напишите комментарий, в котором вы объясните, почему вы это делаете, обсуждение может только выиграть от этого, спасибо и извините за высказывание.
На самом деле в этом есть смысл, так как в javascript написание большего количества кода означает большее время загрузки (это компромисс, который, кстати, все знают), я написал код javascript, который работает в очень медленной архитектуре, поэтому для меня это важный фактор. Я не сказал "не модулировать", я просто сказал "будьте осторожны"
Я не голосовал против вас, но не похоже, что модульность, замедляющая ваш код в javascript, достаточна, чтобы оправдать написание кода в процедурном стиле. Но я предполагаю, что это индивидуально.
Вы также должны установить заголовки «Expires» далеко в будущее для вашего javascript, чтобы клиентский браузер кэшировал его. Это снижает количество показов, с которыми приходится сталкиваться повторяющимся посетителям, когда они посещают ваш сайт.
Вы можете использовать инструмент ccm из АРХИВ сайта blunck.info или репозиторий github jonasblunck / ccm
Он поддерживает JavaScript, C / C++ и C#. Это бесплатно, работает в Windows (также может работать в Linux и Mac OS X - с использованием инфраструктуры Mono).
Теперь есть также Yardstick: https://github.com/calmh/yardstick
Он пытается вычислить цикломатическую сложность для идиоматического Javascript, обрабатывая больше случаев, чем, например, jscheckstyle.
Я помог написать инструмент для анализа сложности программного обеспечения в проектах JavaScript:
Он сообщает множество различных показателей сложности: строки кода, количество параметров, цикломатическую сложность, цикломатическую плотность, меры сложности Холстеда, индекс ремонтопригодности, плотность первого порядка, стоимость изменения и размер ядра.
Он выпущен под лицензией MIT и построен с использованием Node.js и парсера JavaScript Эсприма. Его можно установить через npm, например:
npm i -g complexity-report
Это отличный инструмент. Было бы еще полезнее, если бы его можно было использовать как ворчание. Тогда мы сможем видеть этот отчет при каждой сборке!
Только что нашел черновую задачу для этого инструмента: npmjs.org/package/grunt-complexity
JSComplexity.org: срок действия этого доменного имени истек
@ P5ycH0, домен вернулся с 3 января 2014 года.
По состоянию на 2017 год это решение больше не поддерживается.
JSHint недавно добавлена поддержка для расчета метрик кода.
Вы можете установить максимальные значения для:
maxparams - количество допустимых формальных параметровmaxdepth - насколько глубоко должны быть вложены блоки кодаmaxstatements - количество операторов, разрешенных для каждой функцииmaxcomplexity - максимальная цикломатическая сложностьМаксимальное количество формальных параметров, разрешенных для каждой функции
/*jshint maxparams:3 */
function login(request, onSuccess) {
// ...
}
// JSHint: Too many parameters per function (4).
function logout(request, isManual, whereAmI, onSuccess) {
// ...
}
Максимальное количество вложенных блоков кода, разрешенных для каждой функции
/*jshint maxdepth:2 */
function main(meaning) {
var day = true;
if (meaning === 42) {
while (day) {
shuffle();
if (tired) { // JSHint: Blocks are nested too deeply (3).
sleep();
}
}
}
}
Максимальное количество операторов, разрешенных для одной функции
/*jshint maxstatements:4 */
function main() {
var i = 0;
var j = 0;
// Function declarations count as one statement. Their bodies
// don't get taken into account for the outer function.
function inner() {
var i2 = 1;
var j2 = 1;
return i2 + j2;
}
j = i + j;
return j; // JSHint: Too many statements per function. (5)
}
Для полноты ответов я некоторое время назад искал тот же инструмент и не нашел ничего, что хорошо работало бы для визуализации, поэтому я написал Платон
Образцы отчетов для:
Он использует отчет о сложности Phil (упомянутый выше), а также собирает данные из jshint (и, в конечном итоге, из других).
Я только что был на презентации @jsoverson на Fluent 2014 в Сан-Франциско и был очень впечатлен!
Вышла новая версия http://jshint.com с очень хорошим калькулятором цикломатической сложности.
Модуляризация кода замедляет его? Как это имеет смысл?