Подтвердить что ты не робот

Почему отсутствие сцепления методов (LCOM) включает в себя Getters и Setters

Я смотрю метку 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)

Я не понимаю этот показатель, почему он должен включать в себя геттеры и сеттеры? Геттер и сеттер всегда будут иметь доступ только к одному полю экземпляра.

4b9b3361

Ответ 1

Это демонстрирует, что каждая метрика программного обеспечения ошибочна, если вы слепо доводя ее до крайности.

Вы знаете "incohesive" класс, когда видите его. Например:

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; } }
}

Это, очевидно, класс incohesive, потому что он содержит две части данных, которые не обязательно должны быть друг с другом.

Но, хотя для нас очевидно, что этот класс несовместим, как вы можете получить программное обеспечение для определения incohesion? Как бы это сказало, что вышеуказанный класс является несовместимым, но это не так?

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

Метрика, которую они придумали, безусловно, обнаруживает incohesion, но также придумывает ложные срабатывания.

Что, если вы решили, что эта метрика важна? Вы можете создать класс "CustomerData", содержащий только поля, и класс "Клиент", который предоставляет поля данных как свойства.

// 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
}

Но если я играю в эту игру, я могу применить ее также к примеру incohesive:

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

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

В самом деле, я думаю, что лучше всего понять, что такое сплоченность и почему это стоит, но также понять, что программный инструмент не может его правильно измерить.