20

ここに示すように、LCOMメトリックを見ています。

http://www.ndepend.com/Metrics.aspx

だから私たちはいくつかのことを言っています、

1) A class is utterly cohesive if all its methods use all its instance fields
2) Both static and instance methods are counted, it includes also constructors, properties getters/setters, events add/remove methods

このようなクラスを見ると、

public class Assessment
{
    public int StartMetres { get; set; }
    public int EndMetres { get; set; }
    public decimal? NumericResponse { get; set; }
    public string FreeResponse { get; set; }
    public string Responsetype { get; set; }
    public string ItemResponseDescription { get; set; }
    public string StartText { get; set; }
    public decimal? SummaryWeight { get; set; }
}

各ゲッターとセッターが「他のすべてのインスタンスフィールド」にアクセスしないため、0.94の悪いスコアを取得します。

このように計算されます、

accessAverage - methodCount / 1 - methodCount

(2 - 17) / (1 - 17) = 0.94 (rounded)

このメトリックを理解していませんが、なぜゲッターとセッターを含める必要があるのですか?ゲッターとセッターは常に1つのインスタンスフィールドにのみアクセスします。

4

1 に答える 1

26

これは、盲目的に極端に捉えると、すべてのソフトウェア メトリックに欠陥があることを示しています。

あなたが見たとき、あなたは「まとまりのない」クラスを知っています。例えば:

class HedgeHog_And_AfricanCountry
{

   private HedgeHog _hedgeHog;
   private Nation _africanNation;

   public ulong NumberOfQuills { get { return _hedgeHog.NumberOfQuills; } }
   public int CountOfAntsEatenToday { get { return _hedgeHog.AntsEatenToday.Count(); } }

   public decimal GrossDomesticProduct { get { return _africanNation.GDP; } }
   public ulong Population { get { return _africanNation.Population; } }
}

これは、相互に存在する必要のない 2 つのデータが含まれているため、明らかにまとまりのないクラスです。

しかし、このクラスが非凝集性であることは明らかですが、ソフトウェア プログラムに非凝集性を判断させるにはどうすればよいでしょうか? 上記のクラスはまとまりがなく、これはそうではないことをどのように伝えますか?

class Customer
{
    public string FullName { get; set; }
    public Address PostalAddress { get; set; }
} 

彼らが思いついた測定基準は確かに凝集性を検出しますが、誤検知も出てきます。

このメトリックが重要であると判断した場合はどうなりますか? フィールドだけを含む「CustomerData」クラスと、データ フィールドをプロパティとして公開する「Customer」クラスを作成できます。

// This has no methods or getters, so gets a good cohesion value.
class CustomerData
{
    public string FullName;
    public Address PostalAddress;
}

// All of the getters and methods are on the same object
class Customer
{
   private CustomerData _customerData;
   public string FullName { get { return _customerData.FullName; } }
   // etc
}

しかし、このゲームをプレイしている場合は、まとまりのない例にも適用できます。

class Hedgehog_And_AfricanCountry_Data
{
   public Hedgehog _hedgehog;
   public AfricanNation _africanNation;
}

class Hedgehog_And_AfricanCountry
{
   private Hedgehog_And_AfricanCountry_Data _hedgehogAndAfricanCountryData;
   // etc;
}

本当に、結束とは何か、なぜそれが価値のある目標なのかを理解するのが最善だと思いますが、ソフトウェア ツールでは結束を適切に測定できないことも理解する必要があります。

于 2011-05-16T04:21:07.277 に答える