Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема-05-02испр.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
797.95 Кб
Скачать

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»

Реализация

(Realiza­tion)

Соотнесение спецификации и ее peaлизации

«realize»

Уточнение (Refinement)

Соотнесение элементов, находящихся на разных се­мантических уровнях

«refine»

Отправка (Send)

Отношение между объектом, принимающим сигнал, и объектом, который этот сигнал отправляет

«send»

Трассировка (Trace)

Существование связи между элементами различных моделей (менее точной, чем прямое отображение)

«trace»

Использование (Usage)

Одному элементу для правильного функциониро­вания необходимы услуги другого элемента (сюда входят вызов, конкретизация, параметр, отправка, другие зависимости)

«use»

Использование отношений зависимости особенно уместно при сборке модели из отдельных блоков (например, пакетов), так как эти отношения отражают архитектуру системы.

Трассировка (trace) – это концептуальная связь между элементами различных моделей, час­то находящихся на разных стадиях разработки. Трассировка не обладает подробной семантикой. Обычно она используется для гарантии выполнения моделями системных требований и отслежи­вания тех изменений, которые могут повлиять на другие модели.

Уточнение (refinement) – это отношение между двумя версиями одной концепции на раз­ных стадиях разработки модели или на разных уровнях абстракции. В конечной версии модели остается одна из двух концепций, так как обычно, одна из них представляет собой менее прорабо­танную версию другой. Между обеими версиями существует некоторое соответствие – как прави­ло, более проработанная версия включает в себя элементы проектирования, которые разработчик мог различными способами вносить в исходную концепцию. Теоретически постоянное соотнесе­ние двух версий концепции возможно, но в действительности пока еще ни один инструмент моде­лирования не поддерживает эту функцию в полном объеме. Поэтому отношение уточнения слу­жит разработчику скорее напоминанием, что все модели определенным образом соотносятся друг с другом.

Вывод (derivation) – это отношение зависимости, которое указывает, что один элемент можно вычислить на основе другого, причем вычисленный элемент может после этого присутст­вовать в системе во избежание повторного вычисления.

Вывод, реализация, уточнение и трассировка являются абстрактными зависимостями, так как они являются отношениями между двумя версиями одного и того же элемента системы.

Использование (usage) – это утверждение, что поведение или реализация в программном коде одного элемента влияет на поведение или реализацию другого элемента. Часто отношение использования возникают при реализации. Например, компилятор может требовать наличия опре­деления одного класса для компиляции другого. В большинстве случаев зависимости использова­ния можно вывести из программного кода, не специфицируя их явно. Исключение составляет тот случай, когда отношения зависимости задействованы при проектировании в нисходящем стиле, ограничивающем организацию системы (например, из-за использования предопределенных ком­понентов и библиотек).

Можно указывать и специфические виды использования, однако это делается редко, так как основное назначение использования – указание на отношения зависимости между элементами мо­дели. Все подробности о самой зависимости можно получить из кода программы. Стереотипами для данного рода зависимости являются «вызов» (call) и «создание экземпляра» (instantiation).

Вызов (call) указывает на то, что метод одного класса вызывает операцию в другом классе, а создание экземпляров – что метод одного класса порождает экземпляр другого класса.

Существует несколько видов зависимостей использования, которые описывают возможность доступа одних элементов модели к другим элементам:

  • Доступ (access) позволяет одному пакету «видеть» содержимое другого.

  • Импорт (import), кроме этого, может еще добавлять имена из целевого пакета в пространство имен импортирующего пакета.

  • Дружественность (friend) – это особый вид зависимости доступа, при которой элементу-клиенту разрешено «видеть» закрытое (private) содержимое элемента-поставщика.

Связыванием (binding) называется приписывание конкретных значений параметрам шаб­лона. Это отношение обладает четкой семантикой, которая описывается как подстановка фактиче­ских значений в качестве формальных параметров шаблона.

Использование и связывание поддерживают строгую семантику среди элементов одного уровня. Они служат для соединения элементов, находящихся на одном уровне модели (например, анализа или проектирования), причем оба элемента должны при этом находиться на одном уровне абстракции.

По сравнению с ними зависимости трассировки и уточнения не такие строгие, их можно ис­пользовать с элементами разных уровней или даже разных моделей.

Отношение «являться экземпляром» (instance of) (или метаотношение, причем не обязатель­но отношение зависимости) указывает на то, что один элемент (например, объект) является экзем­пляром другого элемента (например, класса).