Ответ 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;
}
В самом деле, я думаю, что лучше всего понять, что такое сплоченность и почему это стоит, но также понять, что программный инструмент не может его правильно измерить.