Почему отсутствие единства методов (LCOM) включает геттеры и сеттеры
Я смотрю на метрику 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 ответ
Это показывает, что каждая метрика программного обеспечения имеет недостатки, если вы вслепую доводите ее до крайности.
Вы знаете "несвязный" класс, когда видите его. Например:
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; } }
}
Это, очевидно, непривязанный класс, потому что он содержит две части данных, которые не должны быть друг с другом.
Но хотя для нас очевидно, что этот класс непоследователен, как вы можете получить программу для определения непоследовательности? Как это могло бы сказать, что вышеупомянутый класс несвязан, но это не так?
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;
}
На самом деле, я думаю, что лучше понять, что такое сплоченность и почему это стоящая цель, но также и понять, что программный инструмент не может должным образом измерить ее.