循環的複雑性は有用な尺度だと思いますか?
-
09-09-2019 - |
質問
私は大きなコードベースの循環的複雑さを測定して遊んでいます。
循環的複雑度は、プログラムのソース コードを通る線形に独立したパスの数であり、選択した言語に対応した無料のツールが多数あります。
結果は興味深いものですが、驚くべきことではありません。つまり、最も毛深いと私が知っている部分は、実際には最も複雑でした (評価は 50 以上)。しかし、私が便利だと感じているのは、リファクタリングをどこから開始するかを決定するときに参照できるものとして、各メソッドに具体的な「悪さ」番号が割り当てられていることです。
循環的複雑性を使用していますか?あなたが見つけたコードの中で最も複雑なものは何ですか?
解決
私たちは容赦なくリファクタリング、そして私たちの「ヒットリスト」に関するコードを取得するメトリックの1つとして、サイクロマティック複雑さを使用しています。 (それは他の理由のために疑問を受ける可能性が)1-6我々は7-9で疑問が、それ以外の場合は証明しない限り、10以上の任意の方法が悪いと仮定し、複雑さのためにフラグをしないでください。
私たちが見てきた最悪の事態は、我々が引き継ぐために持っていたいくつかのレガシーコードで巨大なのif-else-IFチェーンから87だった。
他のヒント
実際には、循環的複雑度は、単にメソッドレベルのしきい値を超えて使用するように置くことができます。まず第一に、高い複雑性を有する一つの大きな方法は、より低い複雑さを有するいくつかの小さなメソッドに分割されてもよいです。しかし、それは実際にコードベースを改善していますか?確かに、あなたはすべてのそれらのメソッド名によって多少読みやすくを得ることができます。しかし、合計条件付きロジックが変更されていません。そして、トータル条件ロジックは、多くの場合、が多型にして条件文を交換することによって減少させることができます。
私たちは、単なる法の分解によって緑色に変わりはありませんメトリックを必要としています。私は、この CC100 を呼び出します。
CC100 = 100 *(コードベースの総循環的複雑度)/(コードの合計行)
これは大きな-Oが有用であるのと同じように私には便利です:私はそれが何であるかを知っている、との方法が良いか悪いかのために腸の感覚を得るためにそれを使用することができますが、私は計算する必要はありません。それは、すべての機能のために私が書いた。
私はLOCのように、少なくともほとんどの例のように優れている、シンプルな指標を考えます。関数が1つの画面に収まらない場合は、ほとんどそれがどのように簡単な問題ではありません。関数が20個のパラメータを取り、40個のローカル変数を作る場合は、その循環的複雑度が1であれば、それは問題ではありません。
我々は最近、それを使用し始めました。我々はいくつかの静的コード解析を行うためにNDependのを使用し、それが循環的複雑度を測定します。私はそれがリファクタリングする方法を識別するためのまともな方法です、同意します。
悲しいことに、我々は、オフショア私たちの開発者によって作成されたいくつかの方法のための200の上に#の年代を見てきています。
C ++のテンプレート、およびメタプログラミングテクニックでうまく動作することができますツールがあるまで、それは私の状況では多くの助けではありません。とにかくただ覚えている。
「カウントすべてのものをすることができません すべてのものはそれができる測定、およびありません 「カウント測定すること アインシュタイン
だから、あまりにも人間のフィルタリングにより、この種のいずれかの情報を渡すために覚えています。
あなたは複雑さを知っていますよ。主なものツールのこの種は、あなたの注意をエスケープされたコードの一部を低迷される場合に便利です。
私は頻繁に私のコードの循環的複雑度を測定します。私はそれが私があまりにも多く行っているコードの部分を見つけるのに役立ちます発見しました。ツールは私のコードでホットスポットを指摘したことはSRPを、次のされていない方法を把握しようとしている何千行ものコードを読んでするよりもはるかに少ない時間がかかります。
しかし、私は他の人のコードの循環的複雑度の分析を行うとき、私は100年代のサイクロマティック複雑でコードを見つけたとき、それは通常、欲求不満、不安、および一般的な怒りの感情につながることを発見しました。何が彼らのコードの数千行を持つメソッドを作成するために人々を強いる?!
これは、リファクタリングの候補を特定する助けのための素晴らしいことだが、それは周りにあなたの判断を維持することが重要です。私は剪定ガイド用kenj0418の範囲をサポートしたい。
経験的にシングルを思い付く循環的複雑度とJUnitテストカバレッジを兼ね備え CRAP4JするというJavaメトリックがありますメトリック。彼は経験式を試してみて、改善するための研究を行っています。私はそれがどのように広まっわからない。
私はしばらくそれを使用していないが、以前のプロジェクトで、それは本当によそのコード内の潜在的な問題箇所を特定する助けた(もちろん私のではないでしょう!)
エリアのチェックアウトすることを発見すると、私はすぐにロジックといくつかの本当に奇妙なWTFコードで(もGOTOSの多くは、あなたが信じているだろう!)numeriousの問題を発見します。
サイクロマティック複雑さは、おそらくあまりにやっている領域を示すため、単一responsibiltyのprinicpalを破壊するのに最適です。これらは、理想的mulitple機能に分割する必要があります。
残念ながら、このような指標が最も必要なプロジェクトの言語では、 LPC, 、実際には、それを作成するための無料ツールはあまりありません。いいえ、私にとってはあまり役に立ちません。
kenj0418さんのための+1は、リスト値をヒット。
私が見てきた最悪だった、我々ははるかに小さいCCにダウンリファクタリングすることができました200以上のカップルの他の人があった275。彼らはまだ高かったが、それは彼らが、さらにバックラインで押し込みました。 (おそらくまだある)だったIF-のウェブを切り替えると、書類だけではあまりにも複雑だった - 私たちは、275獣の多くの運を持っていませんでした。それは、彼らがシステムを再構築することを決定した場合にのみ、実際の値が、ステップスルーとしてあるのです。
私が快適だっ高いCCの例外は、工場でした。 IMO、彼らは彼らだけの単純なオブジェクトの作成を行うと、返却された場合にのみ高いCCを持つことになっています。
これが何を意味するのかの理解した後、私は今、「裁判」に基づき、それを使用し始めています。通常、高CCはと手をつないで行くので、これまでのところ、私は、それが有用であることが判明しています難しいコードを読んで理解することができますアンチパターンを、矢印。方法を調査するために良いスタートのように見えた、私はまだ固定された数を持っていないが、NDependのは、5以上のすべてのために警告されます。
はい、私たちはそれを使用し、私もそれが有用であることが分かってきました。私たちは、飼いならすために大きなレガシーコードベースを持っているし、我々は高サイクロマティック複雑さをalaramingました。 (1つのメソッドで387!)。 CCは、リファクタリングする価値がある領域に直接あなたを指します。私たちは、C ++コードにCCCCを使用します。