NDRACEによる保守性指標の測定


ソフトウェアシステムを構築するのは簡単ですが、維持するのは難しい.システムが維持されると、コードへの更新が必要になります.
あなたのプロジェクトが発展すると予想されるならば、保全性を助けるためにコードを構成することは重要です.
本稿では、Aの保守性を測定する方法を学びます.Visual Studioで拡張機能としてインストールできるツールであるNAlseを使用したNetプロジェクト.
では、どうやって始めましょうか.

Ndependの紹介


ndependは任意の静的解析を行うツールです.NETプロジェクト.
これは非常に強力であり、コードの行のようなコードの品質を向上させるために使用することができますいくつかのメトリクスを計算することができます、複雑な複雑さ、および結合.
NAlertを使用するには、2つの方法で使用できます.ローカルのVisual Studioインスタンスにインストールしたり、CI/CDパイプラインで使用したり、ビルドプロセス中にレポートを生成したりできます.
この記事では、Visual Studio拡張モジュールとしてインストールしました.準備ができたら、新しいN依存プロジェクトを作成し、現在のソリューションにリンクする必要があります.
これを行うには、⚪ Visual Studioの右下隅にあるアイコン、および新しいN依存プロジェクトを作成します.これはNDProjプロジェクトを作成し、ソリューションに添付します.
新しいN依存プロジェクトを作成するとき、あなたはどちらを選ぶことができます.NETプロジェクトを考慮に入れなければなりません.通常、テストプロジェクトの分析をスキップします.

次に、あなたのソリューションの分析を実行するには⚪ アイコンをクリックして分析を実行し、レポートを生成します.
これで結果にアクセスする方法が2つあります.HTMLレポートでは、次のようにします.

またはVisual Studioと統合されたダッシュボードとして

あなたはHTMLレポートのほとんどのものを見つけるでしょう.

保守性とは


保守性は、それを維持するのがどれくらい簡単かについて説明するソフトウェアシステム(一つのアプリケーションまたはアプリケーションのグループ)の品質です.
簡単にコードを維持する多くの利点があります:
  • は、より速くてより高価なメンテナンス操作
  • を許します
  • 系は、リバースエンジニアリング
  • により容易である
  • コードは、顧客
  • と同様に他のDEVSに向けられます
  • は、元の開発者が会社
  • を去るならば、それがシステムを簡単に更新し続けます
    我々のソフトウェアを維持するのが簡単であることについての考えを持つために我々が使うことができるいくつかのメトリックがあります.
    そして、それらのメトリックを計算するために、いくつかの外部ツールが必要になります.推測何?ndependのように!

    コード行( LOC )


    一般的に、より多くの行のコード(LOCと略称する)は、より複雑であり、したがって、維持するのがより困難である.
    もちろん、それは複雑さについて私たちに伝えるその数の大きさの順序です90000と88000は類似した数字です、あなたは少しの違いも見ません.
    LOCの2種類を計算することができます:物理的LOCと論理的LOC.
    物理的なLOCはあなたのコードの行の総数を参照します.それはあなたがちょうど彼らが表示されるようにコードの行を数えることができるので、計算する最も簡単なものです.
    論理的LOCは効果的に実行可能なコード行だけです.間隔、コメント、およびインポートはこのカウントから除外されます.

    によるLOCの計算


    コードのLOC値を表示する場合は、ndepend HTMLレポートを開きます.
    この値はIlと実際のC Chrountコードに基づいて計算されますので、IDEで見ることができる行の正確な数ではないかもしれません.ところで、どのクラスやメソッドが何らかの注意を必要とするのかを理解するのは良い見積もりです.

    LOCはなぜ重要か?


    LOCの追跡は、より多くの行のコード、より多くのバグのために有用です.
    また、コードの行の多くを持つことは、コードの重複がある可能性が高いので、特にリファクタリングを難しくすることができます.
    それを避ける方法?少なくとも、あなたは低い大きさに移動することはできません.しかし、それでも、小さいLOC値でモジュールのコードを整理することができます.
    このように、あらゆるLOCは容易に維持可能です、特に特定の面(SRP、誰でも)に集中するならば?
    合計LOC値は変更されません.変更されるのは、コードが分離された独立したモジュール間で分散される方法です.

    循環的複雑性


    サイクリックな複雑さは、モジュールを通る線形経路の数の測定です.
    この式は単純なプログラムとメソッドで動作します.
    CC = E-N+2
    
    ここで、Eはグラフのエッジ数であり、Nはノード数である.
    待って!グラフ?😱

    コードは、各ノードがコードのブロックであるグラフとして表すことができます.
    以下に例を示します:
    public string GetItemDescription(Item item)
    {
        string description;
        if (item == null)
            description = string.Empty;
        else
            description = item.Name + " - " + item.Seller;
    
        return description;
    }
    
    ここでは、4つのノード(n = 4)と4つの端(E = 4)を持ちます.

    so
    CC = 4-4+2 = 2
    
    また、手動でccを計算しません.

    NLINEによる循環的複雑性の計算


    先に説明したように、最初のステップはndependを実行し、HTMLレポートを生成することです.次に、左のメニューを開き、メトリクス
    ここでは、あらゆるクラスのための循環的複雑さのための値を見ることができます(しかし、あなたはすべてのメソッドにドリルダウンすることができません).

    CCはなぜ重要ですか?


    循環的複雑さの追跡はモジュールまたは方法の複雑度を理解するのによい.
    CCが高いほど、モジュールを維持し更新することが難しくなります.
    試験例に対しては,低次元の複雑性を用いることができる.メソッドのCCは独立した実行パスの数について説明しますので、その値を使用して、そのメソッドで実行するテストの最小数を確認できます.したがって、前の例では、CC = 2で、少なくとも2つのテストが必要です.

    継承ツリーの深さ


    継承ツリー(dit)の深さは、基本クラスとそのより遠いサブクラスの間のパスの最大長の値です.
    この単純なクラス階層を例に挙げてください.
    public class User{}
    
    public class Teacher : User { }
    
    public class Student : User { }
    
    public class AssociatedTeacher : Teacher { }
    
    クラス間の関係をよりよく理解するために、ツリーとして表現することができます.

    ツリーの最大深さは3であるので、DIT値は3である.

    NLINEでディットを計算する方法


    いつものように、NDALSEでコード解析を実行してHTMLレポートを生成します.
    次に、メトリクスの型メトリックを先頭にして、各クラスのditの値を参照するコードメンバーと継承セクションに移動できます.

    なぜditは重要ですか?


    継承は、コード重複を減らす良い方法です.これは、基本クラスで定義されているすべてを派生クラスで使用できます.
    しかし、まだ、あなたはあなたの目をdit値にしておかなければなりません:深さレベルが特定の量(多くのDEVSによって述べられるように)より大きいならば、あなたはおそらく若干の親クラスのために可能なバグと不必要なふるまいについて興味を起こさせるようになっています.
    また、そのような深い階層を持つことによって、あなたのシステムが維持し、進化するのを難しくするかもしれません.したがって、可能であれば、継承よりも組成を好む.

    について2つの単語


    確かに、ndependは静的解析のための素晴らしいツールです.これらのすべてのメトリックは本当に役に立つことができます.幸いにも、彼らはあなたにそれらの指標の値を与えるだけでなく、彼らも説明します.
    この記事では、NDRACEで見ることができる最も退屈なものを示しました.しかし、あなたは信じられないほど多くのことを行うことができます.
    私のお気に入りは
    不安定性は、あなたのモジュールが維持するのが簡単であるかどうか示します.不安定性と抽象性の関係は、ボブおじさんのきれいな建築書でよく説明されます.

    アセンブリ依存関係.プロジェクトによって参照されるアセンブリをすべて一覧表示します.あなたが使用しているOSSライブラリを追跡するのに特に便利です、場合には、どちらの理由のためにでもそれらを更新する必要があります(log 4 j、誰でも?)

    次に、おそらく私のfav機能であるコンポーネント依存図を参照してください.モジュールとクラスをナビゲートし、どのモジュールがどのモジュールに依存するかを理解できます.

    そして、より多く.
    でも!
    好きなこともあります.
    私は、それを始めるのが難しいとわかりました:最初にインストールして、実行することは全く難しかったです.それを更新してもスムーズではない.
    その後、ナビゲーションメニューは理解しやすいことではありません.スクリーンショット:

    コンポーネント依存図をどこで見つけることができますか?どこにもない-それはホームページからのみアクセス可能です.
    したがって、ツールは非常に便利ですが、それを使用するのは難しい(明らかに、最初に).
    NdependチームがユーザビリティとUIに集中し始めるならば、私はそれが速く働くすべてのチームのために必要なツールになることができると確信します.ネットもちろん、彼らが能力を減らして彼らの製品のために自由な(またはより安い)層をつくるならば、現在、それは全く高価です.まあ、実際にそれは企業のためにかなり安いですが、ソロ版のために手頃な価格ではありません.

    追加リソース


    ndependがこれらのメトリクスをどのように計算するかについてもっと読みたいなら、最善のことはドキュメンテーションに向かうことです.
    🔗 Code quality metrics | NDepend
    そして、明らかに、そのプロジェクトを見てみましょう.
    🔗 NDepend Homepage
    前に言ったように、あまりにも多くのサブクラスを作成するのを避けるべきです.むしろ、オブジェクトを作成して行動を拡張する必要があります.私がここで説明したように、それをする良い方法はデコレータパターンを通してあります.
    🔗 Decorator pattern with Scrutor | Code4IT
    ndependをテストするために、既存の、そしてよく知られているプロジェクトを使用しました.これは、Steve Smith(別名Arardalis)によって作成されたクリーンアーキテクチャです.
    🔗 Clean Architecture repository | GitHub

    ラッピング


    この記事では、私たちは、コードのラインのようなメトリックスを測定する方法を見ました、cyclomatic複雑さと継承木の深さは、Aの保全性に目を向けます.ネットソリューション.
    それをするために、我々はndependを使用しました-私は知っています、それはそれらのメトリックだけのために使われるにはあまりに強力です.バズーカを使って蜂を殺すようなものだ🐝. しかし、まだ現実的なプロジェクトでそれを試してみるのは良かった.
    それで、NAlertは複雑なプロジェクトを管理するのに非常に役に立ちます-それは非常に高価です、しかし、長期的に、それはあなたがお金を節約するのを助けるかもしれません.
    もう使った?
    保全性メトリックを追跡しますか?
    ハッピーコーディング!
    🐧