
- •Тема 5.2. Теоретические основы объектно-ориентированного программирования
- •5.2.1. Основные определения
- •5.2.2. Объектно-ориентированная декомпозиция и объектно-ориентированные модели
- •5.2.3. Объектная модель и ее составные части
- •5.2.4. Средства uml для моделирования классов и их отношений
- •5.2.4.1. Введение в uml
- •5.2.4.2. Статическое представление системы в диаграммах классов
- •5.2.4.3. Визуализация класса
- •5.2.4.4. Уровни представления
- •5.2.4.5. Идентификация классов
- •5.2.4.6. Отношения
- •5.2.4.7. Наследование и обобщение
- •5.2.4.7. Абстрактные классы
- •5.2.4.8. Агрегация и композиция
- •5.2.4.9. Ассоциации
- •5.2.4.10. Классы ассоциаций
- •5.2.4.11 Кратность
- •5.2.4.13. Интерфейс и реализация
- •5.2.4.14. Области видимости
- •5.2.4.15. Зависимости
- •5.2.5. Визуализация существующего кода.
- •Практическое руководство. Поиск кода с помощью обозревателя архитектуры
- •Открытие обозревателя архитектуры
- •Обозреватель архитектуры: домены, представления, узлы, типы узлов и типы ссылок
- •Поиск исходного кода в решении Visual Studio
- •Представление классов в обозревателе архитектуры
- •Поиск кода в решении
- •Поиск скомпилированного кода
- •5.2.6. Visual Studio 2010 - uml моделирования проектов
5.2.4.14. Области видимости
Понятие области видимости тесно связано с интерфейсом и реализацией. Термин видимость применяется по отношению к атрибутам и операциям и задает типы других классов, которые могут использовать заданные атрибуты или операции класса (или операции интерфейса). Выделяют три области видимости. Элементы открытой области (public) могут использовать другие классы. Атрибуты и операции защищенной области (protected) могут использовать только наследники этого класса. Атрибуты и операции закрытой (private) области используются только самими классами. Для телевизионной аппаратуры операции ИзменитьГромкость() ИзменитьКанал() доступны, а операция ОтобразитьКартинкуНаЭкране() – закрыта. Для автомобиля операции УвеличитьСкорость() и Тормозить() – открыты, а операция ОбновитьКилометраж() относится к защищенной области.
Несложно догадаться, что реализация предполагает открытость всех операций интерфейса. Ограничивать доступ к операциям не имеет смысла, потому что они применяются реализации множества классов.
Для обозначения открытой
области видимости перед обозначением
атрибута или операции ставится
символ «+», элементы защищенной области
помечаются символом «#», закрытой
области – символом
«–». Примеры вышеупомянутых обозначений
открытых, защищенных и закрытых операций
для телевизора и автомобиля приведены
на рис. 5.2-34.
+Производитель +Модель
+ИзменитьНромкость()
+ИзменитьКанал()
-ОтобразитьКартинкуНаЭкране()
Автомобиль
+Производитель +Модель
Рис. 5.2-34. Обозначение области видимости атрибутов и операций в классах
5.2.4.15. Зависимости
Зависимость (dependency) указывает на семантические отношения, существующие между двумя и более элементами модели. Зависимость касается самих элементов модели, а не их экземпляров и описывает ситуацию, при которой изменения в независимом элементе (поставщике) требуют изменений в зависимом элементе (клиенте). Согласно такому определению, отношения ассоциации и обобщения также попадают в раздел зависимостей, однако у них есть своя специфическая семантика. Именно поэтому ассоциации и обобщения выделены в отдельные понятия, которым даны собственные названия. Зависимостями называются все прочие отношения (табл. 5.2-2).
Таблица 5.2-2 Виды зависимостей
Зависимость |
Функция |
Ключевое слово |
|
Доступ (Access) |
Пакет имеет доступ к содержимому другого пакета |
«access» |
|
Связывание (Binding) |
Присваивание значений параметрам шаблона для создания нового элемента модели |
«bind» |
|
Вызов (Call) |
Метод одного класса вызывает операцию другого класса |
«call» |
|
Вывод (Derivation) |
Один экземпляр может быть вычислен на основе информации, предоставленной другим экземпляром |
«derive» |
|
Дружественность (Friend) |
Элемент имеет доступ к содержимому другого элемента, вне зависимости от его видимости |
«friend» |
|
Импорт (Import) |
Пакет имеет доступ к содержимому другого пакета и добавляет имена из пространства имен этого пакета в пространство имен импортера |
«import» |
|
Создание экземпляра (Instantiation) |
Метод одного класса создает экземпляры другого класса |
«instantiate» |
|
Параметр (Parameter) |
Отношение между операцией и ее параметрами |
«parameter» |
|
Реализация (Realization) |
Соотнесение спецификации и ее peaлизации |
«realize» |
|
Уточнение (Refinement) |
Соотнесение элементов, находящихся на разных семантических уровнях |
«refine» |
|
Отправка (Send) |
Отношение между объектом, принимающим сигнал, и объектом, который этот сигнал отправляет |
«send» |
|
Трассировка (Trace) |
Существование связи между элементами различных моделей (менее точной, чем прямое отображение) |
«trace» |
|
Использование (Usage) |
Одному элементу для правильного функционирования необходимы услуги другого элемента (сюда входят вызов, конкретизация, параметр, отправка, другие зависимости) |
«use» |
Использование отношений зависимости особенно уместно при сборке модели из отдельных блоков (например, пакетов), так как эти отношения отражают архитектуру системы.
Трассировка (trace) – это концептуальная связь между элементами различных моделей, часто находящихся на разных стадиях разработки. Трассировка не обладает подробной семантикой. Обычно она используется для гарантии выполнения моделями системных требований и отслеживания тех изменений, которые могут повлиять на другие модели.
Уточнение (refinement) – это отношение между двумя версиями одной концепции на разных стадиях разработки модели или на разных уровнях абстракции. В конечной версии модели остается одна из двух концепций, так как обычно, одна из них представляет собой менее проработанную версию другой. Между обеими версиями существует некоторое соответствие – как правило, более проработанная версия включает в себя элементы проектирования, которые разработчик мог различными способами вносить в исходную концепцию. Теоретически постоянное соотнесение двух версий концепции возможно, но в действительности пока еще ни один инструмент моделирования не поддерживает эту функцию в полном объеме. Поэтому отношение уточнения служит разработчику скорее напоминанием, что все модели определенным образом соотносятся друг с другом.
Вывод (derivation) – это отношение зависимости, которое указывает, что один элемент можно вычислить на основе другого, причем вычисленный элемент может после этого присутствовать в системе во избежание повторного вычисления.
Вывод, реализация, уточнение и трассировка являются абстрактными зависимостями, так как они являются отношениями между двумя версиями одного и того же элемента системы.
Использование (usage) – это утверждение, что поведение или реализация в программном коде одного элемента влияет на поведение или реализацию другого элемента. Часто отношение использования возникают при реализации. Например, компилятор может требовать наличия определения одного класса для компиляции другого. В большинстве случаев зависимости использования можно вывести из программного кода, не специфицируя их явно. Исключение составляет тот случай, когда отношения зависимости задействованы при проектировании в нисходящем стиле, ограничивающем организацию системы (например, из-за использования предопределенных компонентов и библиотек).
Можно указывать и специфические виды использования, однако это делается редко, так как основное назначение использования – указание на отношения зависимости между элементами модели. Все подробности о самой зависимости можно получить из кода программы. Стереотипами для данного рода зависимости являются «вызов» (call) и «создание экземпляра» (instantiation).
Вызов (call) указывает на то, что метод одного класса вызывает операцию в другом классе, а создание экземпляров – что метод одного класса порождает экземпляр другого класса.
Существует несколько видов зависимостей использования, которые описывают возможность доступа одних элементов модели к другим элементам:
Доступ (access) позволяет одному пакету «видеть» содержимое другого.
Импорт (import), кроме этого, может еще добавлять имена из целевого пакета в пространство имен импортирующего пакета.
Дружественность (friend) – это особый вид зависимости доступа, при которой элементу-клиенту разрешено «видеть» закрытое (private) содержимое элемента-поставщика.
Связыванием (binding) называется приписывание конкретных значений параметрам шаблона. Это отношение обладает четкой семантикой, которая описывается как подстановка фактических значений в качестве формальных параметров шаблона.
Использование и связывание поддерживают строгую семантику среди элементов одного уровня. Они служат для соединения элементов, находящихся на одном уровне модели (например, анализа или проектирования), причем оба элемента должны при этом находиться на одном уровне абстракции.
По сравнению с ними зависимости трассировки и уточнения не такие строгие, их можно использовать с элементами разных уровней или даже разных моделей.
Отношение «являться экземпляром» (instance of) (или метаотношение, причем не обязательно отношение зависимости) указывает на то, что один элемент (например, объект) является экземпляром другого элемента (например, класса).