web-dev-qa-db-ja.com

Javascriptの循環的複雑度を計算する

Javascriptで循環的複雑度を計算するために利用できるツールはありますか?

これは、サーバー側のコードで作業しているときに非常に役立つメトリックであることがわかりました。私が作成するクライアント側のJavascriptで使用できるようにしたいと考えています。

41
Karl

JavaScriptプロジェクトでソフトウェアの複雑さの分析を実行するツールの作成を手伝いました。

複雑性レポート

コード行、パラメーターの数、循環的複雑度、循環的複雑度、ハルステッド複雑度の測定値、保守性指数、一次密度、変更コスト、コアサイズなど、さまざまな複雑度メトリックを報告します。

MITライセンスの下でリリースされ、Node.jsと Esprima JavaScriptパーサーを使用してビルドされます。次のように、npmを介してインストールできます。

npm i -g complexity-report
19
Phil Booth

答えを完全にするために、私はしばらく前に同じツールを探していましたが、視覚化に適したものが見つからなかったので、 plato と書きました。

のサンプルレポート:

Philの複雑さレポート(上記)を使用し、jshint(そして最終的には他のデータ)からのデータも集約します。

12
jsoverson

循環的複雑度は、キーワード「if、switch、while for break」などの数を数えて評価されるため、sourcemonitorのように、Cで動作するすべてのツールがその役割を果たします。 http://www.campwoodsw.com/ sourcemonitor.html

実際、JavaScriptでは、コードをモジュール化しようとすればするほど、コードの速度が低下するので、一粒の塩を使ってください;)

編集:私本当にはこの答えで何が起こっているのか理解できません、私は私の答えで循環的計算のための良いツールを言うとき、私は別の反対票を受け取りますjavascriptの複雑さ、そしてこれは特に非常にうまく機能します。

2番目のアサーションについては、私のものは経験から得られたコメントです、私は決してあなたのjsコードを変調しないでください、私は注意を払うように言うだけですそれを行う際に、速度とのトレードオフがしばしばあるため、速度について話すとき、2つの異なる速度低下が発生する可能性があることを意味します:ダウンロード時間実行時間(そしてpda /スマートフォンのような遅いデバイスではこれは重要です)。

このようなツールは、開発者が可能な限り小さなインデックスを追跡しようとしてより多くのコードを書くように駆り立てることが多いため、jsでは残念ながらコードが増えると速度が低下し、乱用これらのツールの悪いです。 Surellyこれらのツールは、コードを改善できるwhereのヒントを提供しますが、ツールの使用方法をマスターする必要があり、盲目的にツールに依存することはありません。 。

それで、あなたが私に再び反対票を投じるならば、あなたがそうする理由を説明するコメントを書いてください、議論はこれからのみ利益を得ることができます、ありがとうそしてベントを申し訳ありません。

9
kentaromiura

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)
}
8
daniellmb

http://jshint.com の新しいバージョンがリリースされ、非常に優れた循環的複雑度計算機が搭載されています

Ccmツールは http://www.blunck.info/ccm.html から使用できます。

Javaスクリプト、c/c ++およびc#を実行します。これは無料で、Windowsで実行されます(LinuxおよびMac OS Xでも実行できます-モノフレームワークを使用)。

2
Arne

ヤード尺もあります: https://github.com/calmh/yardstick

慣用的なJavascriptの循環的複雑度を計算しようとし、たとえばjscheckstyleよりも多くのケースを処理します。

2
Jakob Borg