Поделиться через


Метрики кода — связь классов

Связь между объектами (CBO) также определяется именем CK94. В основном связь классов — это мера того, сколько классов использует один класс. Большое число плохо, и низкое число обычно хорошо с этой метрикой. Связь классов показана как точный прогнозор сбоя программного обеспечения и последние исследования показали, что максимальное значение 9 является наиболее эффективным S2010.

Согласно документации Майкрософт, объединение классов "измеряет связь с уникальными классами с помощью параметров, локальных переменных, возвращаемых типов, вызовов методов, универсальных или шаблонных экземпляров, базовых классов, реализаций интерфейса, полей, определенных во внешних типах и оформлении атрибутов. Хороший дизайн программного обеспечения диктует, что типы и методы должны иметь высокую сплоченность и низкую связь. Высокая связь означает дизайн, который трудно использовать и поддерживать из-за его многочисленных взаимозависимостей по другим типам".

Концепции связывания и сплоченности четко связаны. Чтобы сохранить эту дискуссию по теме, мы не будем проникать в глубину с сплоченностью, кроме того, чтобы дать краткое определение из KKLS2000:

"Согласованность модуля была введена Yourdon и Константин как "как тесно привязаны или связаны внутренние элементы модуля друг к другу" YC79. Модуль имеет сильную сплоченность, если она представляет ровно одну задачу [...], и все его элементы способствуют этой одной задаче. Они описывают сплоченность как атрибут дизайна, а не код, а атрибут, который можно использовать для прогнозирования повторного использования, удобства обслуживания и изменчивости».

Пример зависимости классов

Рассмотрим связь классов в действии. Сначала создайте консольное приложение и создайте класс Person с некоторыми свойствами в нем, а затем сразу вычислите метрики кода:

Пример связывания классов 1

Обратите внимание, что связь классов имеет значение 0, так как этот класс не использует другие классы. Теперь создайте другой класс PersonStuff с методом, который создает экземпляр Person и задает значения свойств. Вычислите метрики кода еще раз:

Пример связывания классов 2

Узнайте, как происходит связь класса? Обратите внимание, что независимо от того, сколько свойств задано, значение зависимостей класса просто поднимается на 1, а не на какое-то другое значение. Объединение классов измеряет каждый класс только один раз для этой метрики независимо от того, сколько он используется. Кроме того, можно увидеть, что DoSomething() имеет 1, но конструктор PersonStuff(), имеет значение 0 для его значения? В настоящее время в конструкторе отсутствует код, использующий другой класс.

Что делать, если вы помещаете код в конструктор, который использовал другой класс? Вот что вы получаете:

Пример связывания классов 3

Теперь конструктор четко имеет код, использующий другой класс, и метрика зависимого класса показывает этот факт. Опять же, можно увидеть общую связь классов для PersonStuff() 1, а DoSomething() также 1, чтобы показать, что используется только один внешний класс независимо от того, какой внутренний код используется.

Затем создайте другой класс. Присвойте этому классу имя и создайте в нем некоторые свойства:

Пример связывания классов — добавление нового класса

Теперь потребляйте класс в нашем DoSomething() методе PersonStuff в классе и снова вычисляйте метрики кода:

Пример связывания классов 4

Как видно, связь классов для класса PersonStuff занимает до 2, и, если вы детализируете класс, можно увидеть, что DoSomething() метод имеет большую связь в нем, но конструктор по-прежнему использует только 1 класс. Используя эти метрики, можно просмотреть общее максимальное число для данного класса и детализированное описание на основе каждого члена.

Магическое число

Как и в случае с цикломатической сложностью, нет ограничений, которые соответствуют всем организациям. Однако S2010 указывает, что предел 9 является оптимальным:

"Поэтому мы рассмотрим пороговые значения [...] как наиболее эффективный. Эти пороговые значения (для одного члена) — CBO = 9[...]". (акцент добавлен)

Анализ кода

Анализ кода включает категорию правил обслуживания. Дополнительные сведения см. в разделе "Правила обслуживания". При использовании устаревшего анализа кода набор правил расширенного руководства по проектированию содержит область обслуживания:

Правила руководства по расширенному проектированию для связывания классов

Внутри области удобства обслуживания является правилом для связывания классов:

Правило связывания классов

Это правило выдает предупреждение при чрезмерном связывании классов. Дополнительные сведения см. в разделе CA1506: избегайте чрезмерного связывания классов.

Цитаты

CK94

Chidamber, S. R. и Kemerer, C. F. (1994). Набор метрик для объектно-ориентированного проектирования (ТРАНЗАКЦИИ IEEE по программному проектированию, vol. 20, No 6). Получено 14 мая 2011 года из веб-сайта Университета Питтсбурга: http://www.pitt.edu/~ckemerer/CK%20research%20papers/MetricForOOD_ChidamberKemerer94.pdf

KKLS2000

Kabaili, H., Keller, R., Lustman, F., and Saint-Denis, G. (2000). Сплоченность класса пересмотрелась: эмпирическое исследование промышленных систем (материалы семинара по количественным подходам в объектно-ориентированном программном проектировании). Получено 20 мая 2011 г. из веб-сайта Université de Montréal http://www.iro.umontreal.ca/~sahraouh/qaoose/papers/Kabaili.pdf

SK2003

Субрамам, Р. и Шрина, М. С. (2003). Эмпирический анализ метрик CK для сложности объектно-ориентированного проектирования: последствия для дефектов программного обеспечения (транзакции IEEE в области программного обеспечения, vol. 29, No 4).

S2010

Шатнави, Р. (2010). Количественное исследование допустимых уровней рисков объектно-ориентированных метрик в системах с открытым исходным кодом (транзакции IEEE по программному проектированию, vol. 36, No 2).

YC79

Эдвард Твойдон и Ларри Л. Константин. Структурированный дизайн. Prentice Hall, Englewood Cliffs, N.J., 1979.