Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Статический анализ программ.doc
Скачиваний:
32
Добавлен:
01.05.2014
Размер:
82.43 Кб
Скачать

Не все категории должны быть устойчивы

Если бы все категории в системе были максимально устойчивы, система была бы неизменна. На самом деле, мы хотим часть проекта иметь достаточно гибкой, чтобы оставшаяся часть оставалась неизменной. Как может категория с максимальной устойчивостью (I=0) быть достаточно гибкой, чтобы противостоять изменениям? Ответ должен быть найден в использовании принципа "открыт/закрыт". Руководствуясь этим принципом, можно и желательно создать классы, которые являются достаточно гибкими, чтобы быть расширенными, и не требовать при этом модификации. Какие классы соответствуют этому принципу? Абстрактные классы.

Рассмотрим программу Copyснова. КлассыReaderиWriter- это абстрактные классы. Они очень устойчивы, так как они не зависят ни от чего. От этих абстрактных классов зависят все их потомки и классCopy. Тем не менее, классыReaderиWriterмогут быть расширены без их модификации, чтобы иметь дело со многими видами устройств ввода-вывода.

Таким образом, если категория должна быть устойчивой, она должна состоять из абстрактных классов, чтобы ее можно было затем расширить. Устойчивые категории те, которые являются расширяемыми, гибкими и не ограничивают проект.

Если устойчивые категории должны быть очень абстрактными, то можно сделать вывод, что нестабильные категории должны быть очень конкретны. На самом деле это стоит обсудить подробнее.

Абстрактная категория должнаиметь зависимые от нее категории, поскольку должны существовать классы вне этой абстрактной категории. Эти классы есть наследники классов из этой категории, либо они реализуют отсутствующие у них чистые интерфейсы из абстрактной категории. Мы однако не хотим поощрять зависимости от нестабильных категорий. Нестабильные категории должны быть поэтому не абстрактными, а конкретными.

Мы можем определять метрику, которая измеряет "абстрактность" категории следующим образом:

  • A: Абстрактность (Abstractness): A = nA / nAll. nA - количество_абстрактных_классов_в_категории. nAll   - oбщее_количество_классов_в_категории. Значения этой метрики меняются в диапазоне [0,1]. 0 - категория полностью конкретна,  1 - категория полностью абстрактна.

Главная последовательность

Теперь мы в состоянии определить отношение между стабильностью (I) и абстрактностью (A). Мы можем создавать граф с (A) на вертикальной оси и  (I) на горизонтальной оси. Если мы начертим на этом графике два вида "хороших"  категорий, то категории, которые являются максимально устойчивыми и абстрактными, окажутся в верхнем левом углу в (0,1). Категории, которые являются максимально нестабильными и конкретными - в нижнем правом углу (1,0).

Но не все категории окажутся в одной из этих двух позиций. Категории имеют степени абстракции и стабильности. Например, очень часто один абстрактный класс порожден от другого абстрактного класса. Порожденный класс - абстракция, которая имеет зависимость из-за его порождения. Поэтому, хотя он имеет   максимальную абстракцию, он не будет максимально стабилен. Эта его зависимость уменьшит его стабильность.

Рассмотрим категорию с A=0 иI=0. Это - очень стабильная и конкретная категория. Такая категория не желательна из-за своей "твердости". Она не может быть расширена, потому что не абстрактна. И очень трудно изменяема из-за своей стабильности.

Рассмотрим категорию с A=1 иI=1. Эта категория также нежелательна (и даже невозможна), потому что она - максимально абстрактна, и, тем не менее, ее никто не использует. Она также твердая, потому что такие абстракции невозможно расширить.

Что можно сказать относительно категории A=.5 иI=.5? Эта категориячастичнорасширяема, потому что она частично абстрактна. Кроме того, она частично стабильна, поскольку расширения не являются максимально неустойчивыми. Такая категория выглядит "сбалансированной". Ее стабильность находится в балансе с ее абстрактностью.

Рассмотрим снова граф (A-I), показанный ниже на рисунке. Мы можем нарисовать линию из (0,1) в (1,0). Эта линия (A+I= 1)представляет категории, чья абстрактность сбалансирована с их стабильностью. Из-за сходства с графом, используемым в астрономии, эту линию можно назватьГлавная последовательность.

Категория, которая расположена на главной последовательности, не "слишком абстрактна" для ее стабильности, ни - "слишком нестабильна" для ее абстрактности.

Она имеет "правильное" количество конкретных и абстрактных классов пропорционально ее центробежным и центростремительным зависимостям. Ясно, наиболее желательные положения для категории на одном из концов главной последовательности. Однако, судя по опыту, только приблизительно половина категорий проекта может иметь такие идеальные характеристики. Оставшиеся категории имеют лучшие характеристики,  если они или расположены близко к главной последовательности, или расположены прямо на ней.