6.2. СТАБИЛЬНОСТЬ АБСТРАКЦИЙ
101
Стабильность пакета должна быть пропорциональна его
абстрактности, где абстрактность пакета определяется как
A = Na/N, где
Na — количество абстрактных классов пакета
N — общее количество классов пакета
Дистанция пакета от прямой (0,1)-(1,0) на графике IAопре-
деляется как
D=|A+I-1| R.Martin, 1996
Принцип утверждает, что наилучшим балансом между абстракт-
ностью и стабильностью обладают пакеты с наименьшей дистанци-
ей. Рассмотрим применение этого принципа на примере диаграммы
6.1: Диаграмма показывает типичную для архитектур клиент-сервер
диаграмму пакетов и классов. Рядом с пакетами указаны их метри-
ки: абстрактность, нестабильность и дистанция. Заметим, что такая
диаграмма полностью соответствует принципу стабильности зависи-
мостей, так как все пакеты зависят только от более стабильных. Пред-
ставим теперь, что по каким-то причинам нам захотелось избавиться
от класса ResultSet и переместить класс SomeResultSet на его место в
пакет AbstractServer. Это очевидно неправильное решение, так как аб-
стракция более высокого уровня Server начинает зависеть от обычного
класса SomeResultSet
3
, но посмотрим на диаграмме 6.2, что нам ска-
жут метрики. Как мы видим, выбранные метрики чрезвычайно чустви-
тельны к таким нарушениям, так как дистанция пакетов AbstractServer
и MyServer стала равной 1/2 против 0 и 1/3 до внесения изменений.
Некоторые CASE-средства, такие как Together, поддерживают вы-
числение различных метрик по UML модели. Для вычисления описан-
ных выше метрик стабильности и абстрактности в JAVA-программах
можно воспользоваться утилитой jdepend, которую читатель может най-
ти в сети Internet.
3
Нарушая, таким образом, принцип инверсии зависимости