Что такое график абстрактности и нестабильности?
недавно я использовал NDepend, и он подготовил хороший отчет о моих сборках .net и связанных pdbs.
самое интересное, что я нашел в отчете, - это график абстрактности и нестабильности. Я хотел понять это в деталях, я читал их документы и онлайн-метрики, но это могло помочь только в определенной степени.
в первую очередь я хочу понять, как правильно оценить график и методы управления абстрактностью со стабильностью.
там очень хорошая статья здесь это говорит об этом, но что еще в дополнение к этому мне нужно: "как я могу это контролировать ? [управление абстрактностью со стабильностью]'
2 ответов
абстрактность является мерой жесткости программной системы. Чем выше абстракция, тем меньше жесткость (или больше гибкость) и наоборот. Если компоненты системы зависят от абстрактных классов или интерфейсов, такую систему легче расширить и изменить, чем если бы она зависела непосредственно от конкретных классов.
стабильность является мерой толерантности к изменениям, как в том, насколько хорошо программная система позволяет изменения в нем, не нарушая его. Это определяется анализ взаимозависимости компонентов системы.
Роберта С. Мартина статьи on OO metrics описывает эти понятия в более количественных терминах.
выдержка из статьи:
ответственность, независимость и стабильность категории могут быть измерены путем подсчета зависимости, которые взаимодействуют с этой категорией. Были определены три показателя:
Ca: Афферентные Соединения : число классов вне этой категории, которые зависят от классов внутри этой категории.
Ce: эфферентные соединения: количество классов внутри этой категории, которые зависят от классов вне этой категории.
I: нестабильность: (Ce ÷ (Ca+Ce)) : эта метрика имеет диапазон [0,1]. I=0 указывает на максимально стабильную категорию. I=1 указывает на максимальную нестабильность категория.
A: абстрактность: (#абстрактные классы в категории ÷ всего # классов в категории). Этот показатель диапазона [0,1]. 0 означает конкретное, а 1 означает полностью абстрактное.
в любой программной системе, особенно большой, баланс имеет решающее значение. В этом случае система должна балансировать абстрактность со стабильностью, чтобы быть "хорошей". Позиция на графике A-I показывает это. Пожалуйста, прочитайте статью для объяснение.
абстрактность и нестабильность могут использоваться только для оценки вашего кода. Вы заранее знаете, насколько абстрактным или стабильным должен быть какой-то модуль. Например, вы хотите, чтобы слой презентации был умеренно абстрактным и высокостабильным, потому что от него зависят более низкие модули. С другой стороны, вы хотите, чтобы уровень инфраструктуры был очень конкретным (низкая абстрактность) и очень неустойчивым, потому что он должен реализовывать то, что требуют верхние слои.
Как только это ясно, вы можете объединить абстрактность и неустойчивость в один граф, и это граф неустойчивости-абстрактности. Вы хотите, чтобы ваш код проявлял столько же абстрактности, сколько и стабильности, чтобы сбалансировать потребности в поддержке будущих изменений в требованиях.
но в любом случае, вы должны иметь сильное понимание нестабильности и абстрактности метрик в одиночку, прежде чем пытаться понять их работу вместе. Вы можете найти несколько примеров того, что означает нестабильность в этой статье:как использовать модуль Метрики сцепления и нестабильности для руководства рефакторингом
существует связанная статья, выводящая запрос CQLinq, который измеряет нестабильность всех модулей в приложении:как измерить модуль сцепления и нестабильности с помощью NDepend