2008-09-19 8 views
34

Existe-t-il des outils disponibles pour calculer la complexité cyclomatique en Javascript? J'ai trouvé que c'était une métrique très utile dans le passé quand je travaillais sur du code côté serveur, et je voudrais pouvoir l'utiliser pour le côté Javascript que j'écris côté client.Calculer la complexité cyclomatique pour Javascript

+0

J'ai déplacé mon outil de jsmeter à un nouveau site: http://jsmeter.info – Noah

Répondre

18

J'ai travaillé sur un outil d'analyse de code statique JavaScript qui calcule la complexité cyclomatique pour JavaScript. Vous pouvez essayer une version en ligne de jsmeter ici: http://jsmeter.info

+1

Votre outil n'est pas compatible avec ECMAScript5. Il ne peut pas analyser un objet régulier comme: '{a: 2,}' – mgol

+1

@m_gol Les virgules de fin FYI sont mauvaises et provoqueront une erreur dans certains navigateurs. –

+4

@RobEvans Non, les virgules flottantes ne sont pas une mauvaise pratique, c'est votre opinion subjective. Au contraire, les virgules de fin peuvent être utiles car elles aident avec les diffs git car vous n'avez pas besoin de changer les lignes définissant d'autres éléments si vous ajoutez/en supprimez un nouveau. En ce qui concerne "certains navigateurs" - c'est fondamentalement IE <9. Si vous n'avez pas besoin de vous soucier d'eux, vous pouvez utiliser des virgules. Dans mes propres projets, j'applique généralement des virgules flottantes dans le guide de style pour les raisons mentionnées. – mgol

6

Depuis la complexité cyclomatique est évaluée en comptant le nombre de mots clés « if, switch, alors que pour la pause » etc .. tous les outils qui fonctionne avec C fera le travail, comme SourceMonitor: http://www.campwoodsw.com/sourcemonitor.html

En fait, javascript plus vous essayez de modulize votre code, plus vous ralentir, donc prendre avec un grain de sel;)

EDIT: Je ne peut pas vraiment comprendre ce qui se passe sur cette réponse , Je reçois un autre downvote, quand dans ma réponse je dis ag ood outil pour calculer la complexité cyclomatique en javascript, et cela fonctionne particulièrement bien.

Pour la deuxième affirmation, le mien est un commentaire qui vient de l'expérience, je ne dis jamais ne modulize pas votre code js, je dis que pour faire attention à le faire, parce que souvent il y a un compromis entre avec vitesse, et quand je parle de vitesse, je veux dire que 2 ralentissement différent peut arriver: au temps de téléchargement et au temps d'exécution (et dans un dispositif lent comme pda/smartphone c'est important).

Depuis des outils comme celui-ci conduisent souvent développeur en écrivant plus de code en essayant de chasser le plus petit indice possible, mais dans js plus de code signifie malheureusement que les ralentissements peuvent se produire, et l'utilisation excessive de ces outils est mauvais. Surelly ces outils peuvent vous donner des indices de votre code peut être amélioré, mais vous devez maîtriser la façon d'utiliser l'outil et ne pas aveugler compter dessus.

Donc, si vous me rejetez encore une fois, s'il vous plaît écrire un commentaire dans lequel vous expliquez pourquoi vous le faites, la discussion ne peut que bénéficier de cela, merci et désolé pour l'évent.

+0

modularisation votre code il est lent vers le bas? Comment cela peut-il avoir un sens? – MDCore

+1

En fait, il a du sens, car en javascript écrire plus de code signifie plus de temps de téléchargement (c'est un compromis que tout connaît), j'ai écrit un code javascript qui fonctionne en architecture très lente. Je n'ai pas dit "ne pas moduler", je dis juste "soyez averti" – kentaromiura

+0

Je ne vous ai pas downvote, mais il ne semble pas que modularisé ralentit votre code en javascript est suffisant pour justifier l'écriture de votre code dans un style procédural. Mais je suppose que c'est au cas par cas. –

2

Vous pouvez utiliser l'outil ccm de http://www.blunck.info/ccm.html.

Il fait java-script, c/C++ et C#. C'est gratuit, fonctionne sur Windows (peut être exécuté sur Linux et Mac OS X - en utilisant un framework mono).

2

Il y a maintenant YardStick: https://github.com/calmh/yardstick

Il essaie de calculer la complexité cyclomatique Javascript pour idiomatiques, la manipulation plus de cas que par exemple jscheckstyle.

17

J'aidé à écrire un outil pour effectuer une analyse de la complexité des logiciels sur des projets JavaScript:

complexity-report

Il fait état d'un tas de différentes mesures de complexité: lignes de code, le nombre de paramètres, la complexité cyclomatique, la densité cyclomatique, Mesures de complexité de Halstead, l'indice de maintenabilité, la densité de premier ordre, le coût de changement et la taille de base.

Il est publié sous la licence MIT et construit en utilisant Node.js et l'analyseur JavaScript Esprima. Il peut être installé via NPM, comme ceci:

npm i -g complexity-report 
+0

C'est un excellent outil. Ce serait encore plus utile s'il peut être utilisé comme une tâche fastidieuse. Ensuite, nous pouvons voir ce rapport à chaque construction! – ShitalShah

+0

Tâche juste trouvée pour cet outil: https://npmjs.org/package/grunt-complexity – ShitalShah

+0

JSComplexity.org: Ce nom de domaine a expiré – P5ycH0

5

JSHint récemment added support pour le calcul des métriques de code. Vous pouvez définir des valeurs maximales pour the number of formal parameters allowed (maxparams), how deeply nested code blocks should be (maxdepth), the number of statements allowed per function (maxStatements), ainsi que the maximum cyclomatic complexity (maxcomplexity).

Nombre maximum de paramètres formels autorisés par fonction

/*jshint maxparams:3 */ 

function login(request, onSuccess) { 
    // ... 
} 

// JSHint: Too many parameters per function (4). 
function logout(request, isManual, whereAmI, onSuccess) { 
    // ... 
} 

Nombre maximum de blocs de code imbriqués autorisés par fonction

/*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(); 
     } 
    } 
    } 
} 

Nombre maximum de déclarations autorisées par la fonction

/*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) 
} 
10

Pour être complet dans les réponses, je cherchais le même outil il y a quelque temps et n'a rien trouvé qui fonctionnait bien pour la visualisation j'ai donc écrit plato

exemples de rapports pour:

Il utilise le rapport de complexité de phil (mentionné ci-dessus) et regroupe également les données de jshint (et éventuellement d'autres).

+0

Je viens d'assister à la présentation de @jsoverson à Fluent 2014 à San Francisco et j'ai été très impressionné! –

Questions connexes