はじめに
多くの場合、プログラマーは他の人のコードを保守する必要があります。非常に多くの場合、このコードは見栄えがよくなく、保守が非常に困難です。 このアプリケーションをすぐに破棄する必要がない場合は、当然、人間の形にする必要があります。 リファクタリング。 コードの品質を評価し、改善する価値のある場所を特定できるようなメトリックがあると便利です。 このようなメトリックにより、たとえば、プログラマーがソースコードを記述する方法や、サポートするアプリケーションのコードの品質を評価することができます。
Microsoftは、プロジェクトのコードを評価できるVisual Studioの組み込みツールを提供します。
プロジェクトを右クリックして[コードメトリックの計算]を選択すると、コードの推定値を取得できます(この機能は、Premiumバージョン以降のVisual Studio 2008 Team SystemおよびVisual Studio 2010で使用できます)。
メトリックの説明
結果には、コードの5つのメトリックが含まれます。
- 保守性指数は、コード品質の包括的な尺度です。 この指標は、カーネギーメロンソフトウェアエンジニアリング研究所の専門家によって開発されました。 メトリックは、次の式を使用して計算されます。
MI = MAX(0、(171-5.2 * ln(HV)-0.23 * CC-16.2 * ln(LoC))* 100/171)
- HV-Halstead Volume、計算の複雑さ。 演算子が多いほど、このメトリックの値は大きくなります。
- CC-循環的な複雑さ。 このメトリックについては以下で説明します。
- LoC-コードの行数。
このメトリックは、0〜100の値を取ることができ、コードサポートの相対的な複雑さを示します。 このメトリックの値が大きいほど、コードの保守が容易になります。
Visual Studioは、メトリック値が20〜100の場合は緑で、値が10〜20の場合は黄色で、値が10未満の場合は赤でメソッド/クラスをマークします。 - Cyclomatic Complexity-コードの構造的な複雑さを示します。 コード内の異なるブランチの数。 この指標が高いほど、コードを完全にカバーするためにより多くのテストを書く必要があります。
- 継承の深さ- 継承の深さ。 このメトリックは、クラスごとに、継承チェーン内のアカウントの種類を示します。 たとえば、3つのクラスA、B、Cがあり、BはAから継承され、CはBから継承される場合、クラスA、BおよびCのこのメトリックの値はそれぞれ1、2および3になります。
- クラスカップリング -クラスの相互依存度を示します。 パラメーターの一意のクラス、ローカル変数、戻り値の型、基本クラス、属性が考慮されます(完全なリストはMSDNにあります )。 優れたソフトウェア設計には、少数の関連クラスが含まれます。 存在するほど、将来このクラスを再利用したり、維持したりすることが難しくなります。 非常に多くの依存関係があります。
- コードの行 -コードの行数を示します。 このインジケータは、ファイルの正確な行数を表示しません。 カウントはILコードに基づいています。 空白行、コメント、角括弧付きの行、型の宣言、および名前空間は考慮されません。 メソッド/クラス内の多数の行は、設計エラーを示し、このコードはいくつかの部分に分割できることを示します。
これらのメトリックの読み方については、 こちらをご覧ください 。
実際の使用
プロジェクトの1つで最初に分析を開始したとき、保守性指数の値はすべて緑色でした。 少し奇妙に思えた、なぜなら 書き換える必要があるコードが明らかにありました。 このようなコードセクションのMI値は約30〜40でした。 デフォルトのインジケータは主観的である可能性が高く、どのコードを低品質と見なすかはプログラマ自身が決定する必要があります。
私のプロジェクトでは、ほとんどのメソッドで約70〜90のMIスコアを維持しようとしています。 この指標が50〜60であり、それらを書き換えることができる方法がありますが、コストと利点を評価する価値があります。
このツールのおかげで、大規模なプロジェクトのコードレビューを実施して、書き換えが必要な場所を見つけるのは非常に簡単です。 上記のメトリックを変更するプロセスに従うことも非常に便利です。 これは、プロジェクトの開発に対するプログラマーの態度、および各プログラマーのコードの品質を変更するダイナミクスについてリーダーに示すことができます。これは、私たちの職業で重要です。 メトリックを追跡するもう1つの理由は、プログラマーによって定義されたしきい値であり、それに達するとリファクタリングを行う必要があります。
どうもありがとう。