4

循環的複雑度の基本ルールに従って、以下のコードの複雑度は 2 にする必要があります (分岐点は 1 つだけ - for ループ)。

function SumArray(array_to_sum) {
    var sum = 0;
    for (var i = 0; i < array_to_sum.length; i++) {
        sum += array_to_sum[i];
    }
    return sum;
}

多くの最新のフレームワークなどは、フレームワークjQuery.each()内の またはほとんどのメソッドなどのデータ マッピング機能を提供しますUnderscore.js。次のコードを検討してください。

function SumArray(array_to_sum) {
    var sum = 0;
    jQuery.each(array_to_sum, function(index, value) {
        sum += value;
    });
    return sum;
}

循環的複雑度の典型的なルールにより、2 番目の例の CC 測定値は 1 です。作業はまったく同じであり、人間による関数の複雑さはまったく変わっていません。私がしたことは、データをループする 1 つの手段を別のデータをループする手段に交換することだけでした。

同様に、元の関数の内部を単一の自己呼び出しクロージャーでラップし、メソッドの動作を実際に変更せずに、外側のメソッドの循環的複雑度を 1 にするこの不自然な例を考えてみましょう。

function SumArray(array_to_sum) {
    return (function() {
        var sum = 0;
        for (var i = 0; i < array_to_sum.length; i++) {
            sum += array_to_sum[i];
        }
        return sum;
    })();
}

循環的複雑度の真の測定値には、jQuery.each()特に匿名ローカル クロージャを使用する場合など、データ マッピング/削減方法に関する考慮事項を含める必要がありますか?

おそらく、クロージャーはその複雑さをクロージングの親にエクスポートする必要があります。また、一般的なメソッドは、それを呼び出す関数の複雑さに追加されるエクスポートの複雑さを定義できる必要がありますjQuery.each()。 .

4

2 に答える 2

1

循環的複雑度は、コードの読みやすさの尺度です。McCabe は、Cyclomatic Complexity を測定する前提について、「さらに、複雑なコンポーネントは理解しにくく、テストしにくく、変更しにくい」と説明しています。

つまり、読者にとって複雑なコードは、テストが難しくなるため、バグが発生する可能性が高くなります (単一のコード ブロックを通るパスが多くなります。変更が難しいため、バグのあるままになる可能性があります。理解するのが難しく、人々が変更を避けるためです)。それ。

于 2012-08-26T14:10:06.830 に答える
-2

循環的複雑度の真の測定値には、特に匿名ローカル クロージャーを使用する場合に、jQuery.each() などのデータ マッピング/リダクション メソッドの考慮事項が含まれている必要がありますか?

はい。もちろん。なんでもいい。

しかし、「循環的複雑さ」は人間の仕業であることを忘れないでください。これは、特定のコードがどの程度「複雑」であるかを推定するために、特定のヒューリスティック ファミリーに付けられた名前にすぎません。jQuery(または他のラムダトーティング言語)用の循環的複雑度監査ツールを設計している場合、ええ、特別なケースjQuery.each()は素晴らしい機能であり、ユーザーがそれらの「エクスポートされた複雑さ」を定義できるようにします独自の機能は、さらに優れた機能になります。しかし、これが循環的複雑度を計算する最も真の方法であるという大げさな言葉に夢中にならないようにしましょう。これは、ヒューリスティックを改良したものにすぎません。頭のてっぺんから、さらに10の可能な改良点をあなたに与えることができます.

于 2012-08-26T04:45:37.727 に答える