Что такое график абстрактности и нестабильности?

недавно я использовал NDepend, и он подготовил хороший отчет о моих сборках .net и связанных pdbs.

самое интересное, что я нашел в отчете, - это график абстрактности и нестабильности. Я хотел понять это в деталях, я читал их документы и онлайн-метрики, но это могло помочь только в определенной степени.

в первую очередь я хочу понять, как правильно оценить график и методы управления абстрактностью со стабильностью.

там очень хорошая статья здесь это говорит об этом, но что еще в дополнение к этому мне нужно: "как я могу это контролировать ? [управление абстрактностью со стабильностью]'

alt text

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