Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Uml Book (Rus).doc
Скачиваний:
15
Добавлен:
11.08.2019
Размер:
58.74 Mб
Скачать

Глава 3. Здравствуй, мир !

Авторы языка Си (С) Брайан Керниган (Brian Kernighan) и Деннис Ричи (Dennis Ritchie) сказали как-то, что единственный способ выучить новый язык программи­рования - это писать на нем программы. Данное замечание верно и в отношении UML. Чтобы выучить этот язык, надо писать на нем модели.

Первая программа, которую обычно пишут новички, осваивая незнакомый язык, очень проста - она предполагает вывод на экран текстовой строки «Здрав­ствуй, мир!». Это резонный подход, поскольку воплощение даже такого элемен­тарного замысла вызывает вполне объяснимое чувство удовлетворения. Кроме того, как бы тривиальна ни была данная программа, она содержит всю инфра­структуру, необходимую для того, чтобы приложение могло работать.

Освоение UML мы начнем традиционным способом. Моделирование вывода фразы «Здравствуй, мир!» - пожалуй, простейшее применение языка, но эта про­стота обманчива, поскольку за ней скрыты некоторые любопытные механизмы, заставляющие приложение функционировать. С помощью UML эти механизмы легко моделируются. Поняв их, вы глубже проникнете в структуру этой незамы­словатой программы.

Ключевые абстракции

На языке Java апплет для вывода на экран Web-браузера фразы «Здравствуй, мир!» не представляет собой ничего сложного:

import java.awt.Graphics;

class HelloWorld extends Java.applet.Applet { public void paint (Graphics g) {

g.drawstring("Здравствуй, мир!", 10, 10);

} }

Первая строка кода

import java.awt.Graphics;

делает класс Graphics доступным программе. Префикс j ava. awt определяет конкретный пакет Java, в котором содержится этот класс. Вторая строка

class HelloWorld extends Java.applet.Applet {

определяет новый класс HelloWorld и указывает, что он является разновиднос­тью класса Applet, находящегося в пакете Java. applet.

В следующих трех строках

public void paint (Graphics g) {

g.drawString("Здравствуй, мир;", 10, 10);

}

объявляется операция с именем paint, при реализации которой вызывается дру­гая операция, называемая drawString, ответственная за вывод фразы "Здрав­ствуй , мир" в указанное место на экране. В полном соответствии с принятым в объектно-ориентированном программировании стиле drawString - это опера­ция над параметром с именем g, типом которого является класс Graphics.

Моделирование этого приложения на языке UML не вызывает затруднений. Как видно из рис. 3.1, класс HelloWorld графически можно представить пикто­граммой прямоугольника (информация о классах приводится в главах 4 и 9). Здесь же показана операция paint; ее формальные параметры скрыты, а реализа­ция специфицирована в примечании.

Примечание UML не является языком, визуального программирования, хотя его модели можно - впрочем, не обязательно - выражать на различ­ных языках программирования, таких, например, как Java. Кон­струкция UML позволяет трансформировать модели в код, а код -обратно в модели. Некоторые формы лучше записывать непосред­ственно на языке программирования (например, математические выражения), а другие удобнее визуализироватъ графически с помо­щью UML (например, иерархии классов).

На этой диаграмме классов представлена суть приложения «Здравствуй, мир!», но многие детали опущены. Как видно из приведенного выше кода, в программе задействованы два других класса - Applet и Graphics - и каждый по-разному. Applet является родителем HelloWorld, а класс Graphics необходим для реа­лизации одной из его операций - paint. Эти классы и их отношения с классом HelloWorld можно изобразить в виде другой диаграммы классов (см. рис. 3.2).

Классы Applet и Graphics показаны в виде прямоугольных пиктограмм. Операции не представлены и на пиктограммах скрыты. Незакрашенная стрелка, направленная от класса HelloWorld к классу Applet, соответствует отноше­нию обобщения; в данном случае это означает, что HelloWorld является потом­ком Applet. Пунктирная стрелка от класса HelloWorld к классу Graphics означает отношение зависимости (см. главы 5 и 10), поскольку HelloWorld ис­пользует класс Graphics.

Это, однако, еще не завершение структуры, лежащей в основе класса Hello-World. Изучив библиотеки языка Java, содержащие классы Applet и Graphics, вы обнаружите, что оба они являются частью более обширной иерархии. На рис. 3.3 показана диаграмма классов, которые расширяет и реализует класс HelloWorld.

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

И з рисунка видно, что HelloWorld - всего лишь листовой узел большой иерархии классов. Он выступает в качестве потомка класса Applet, который, в свою очередь, является потомком класса Panel, и так далее вплоть до Obj ect -родителя всех классов в языке Java. Таким образом, данная модель соответствует библиотеке Java - у каждого класса есть родитель.

Отношение между элементами ImageObserver и Component отличается от остальных, и диаграмма классов передает это отличие. В библиотеке Java ImageObserver является интерфейсом (см. главу 11). Это означает, в частности, что у него нет реализации, а потому необходимо, чтобы его реализовывали другие классы. Как видно из рисунка, интерфейсы в UML обозначаются кружочком. О том, что класс Component реализует этот интерфейс, свидетельствует линия, направленная от реализации (Component) к интерфейсу (ImageObserver).

Итак, HelloWorld непосредственно сотрудничает только с двумя классами (Applet и Graphics), но они являются всего лишь малой частью огромной биб­лиотеки предопределенных классов Java. Для облегчения работы ее интерфейсы и классы организованы в виде нескольких пакетов. Корневой пакет среды разра­ботки Java назван, как и следовало ожидать, java. Внутри него содержится не­сколько других пакетов, а внутри них - еще несколько пакетов, классы и интер­фейсы. Класс Object заключен внутри пакета lang, так что его полное имя будет Java. lang. Object. Аналогично классы Panel, Container и Component со­держатся в пакете awt, а класс Applet - в пакете applet. Интерфейс Ima­geObserver входит в состав пакета image, который, в свою очередь, находится в пакете awt, поэтому полное имя интерфейса будет выражено в виде довольно длинной строки j ava.awt.image.ImageObserver.

Разбивку на пакеты можно визуализировать с помощью диаграммы классов, представленной на рис. 3.4.

П акеты на языке UML изображают в виде папок с закладками (см. главу 12). Пакеты могут быть вложенными; существующие между ними зависимости пока­заны с помощью пунктирных стрелок. Например, класс HelloWorld зависит от пакета Java.applet, a Java.applet - от Java.awt.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]