19.12. Проектирование с использованием интерфейсов 437
сообщения объектам других классов), необходимо рассмотреть воз
можность использования интерфейса.
• Выделить группы операций, которые могут повторно использовать
ся гделибо еще. Например, если многим классам системы необхо
дима возможность работы с некоторым устройством вывода, следу
ет подумать о проектировании интерфейса Print.
• Выделить наборы операций, повторяющиеся в нескольких классах.
• Выделить наборы атрибутов, повторяющиеся в нескольких классах.
• Провести поиск классов, играющих в системе одинаковую роль –
роль может указывать на возможный интерфейс.
• Рассмотреть возможности будущего расширения системы. Иногда
даже после небольшого предварительного анализа можно спроек
тировать легко расширяемые в будущем системы. Ключевой во
прос: «Понадобится ли добавлять к системе какиелибо классы
в будущем?» Если ответ положительный, необходимо попытаться
определить один или более интерфейсов, которые будут описывать
протокол добавления этих новых классов.
• Рассмотреть зависимости между компонентами – везде, где это воз
можно, в них должны быть введены разъемы сборки в качестве по
средников.
Как видите, существует много возможностей для использования ин
терфейсов. Подробности проектирования с применением интерфейсов
рассматриваются в следующем разделе.
19.12. Проектирование с использованием
интерфейсов
При проектировании весьма полезно, если сущности ведут себя макси
мально одинаково. Применяя интерфейсы, можно проектировать об
щие протоколы, которые могли бы реализовываться многими класса
ми или компонентами. Хороший пример этому – система, которую мы
разработали, чтобы предоставить общий интерфейс для нескольких
унаследованных систем. Проблема состояла в том, что у каждой систе
мы был свой протокол связи. Нам удалось скрыть эту сложность за
единственным интерфейсом, состоящим из операций open(...), read(...),
write(...) и close().
Приведем другой пример. Рассмотрим систему, моделирующую орга
низацию (например, систему управления человеческими ресурсами).
В ней много классов сущностей, имеющих имя и адрес, например Person,
OrganizationalUnit, Job. Все эти классы могут играть общую роль address
ableUnit (элемент с адресом). Вполне логично, что у всех классов дол
жен быть один и тот же интерфейс для обработки имени и адреса. Сле
довательно, можно определить интерфейс NameAndAddress (имя и ад
рес), который могли бы реализовывать все эти классы. В других реше