2. Язык UML. Руководство пользователя. Буч_ Рамбо_ Якобсон (2-е издание) (2006) (1185732), страница 27
Текст из файла (страница 27)
Свойство видимости UML соответствует общепринятой семантике большинства языков программирования,включая C++, Java. Ada и Eiffel. Отметим, однако, что эти языкинесколько различаются в представлении семантики видимости.Вообще говоря, большинство свойств (атрибутов и операций)классификаторов, которые вам предстоит моделировать, будут иметьобласть действия экземпляра. В статической области действия находятся закрытые атрибуты, которые должны быть разделены между экземплярами класса (например, для генерации уникальныхидентификаторов новых экземпляров класса).На заметку.
Статическая область действия соответствуетстатическим атрибутам и операциям в языках C++ и Java.Статическая область действия применительно к операциям ведет себя несколько иначе. Операция экземпляра имеет неявныйпараметр, который указывает на объект, подлежащий обработке.У статической операции нет такого параметра – она подобна традиционной глобальной процедуре без целевого объекта. Статическиеоперации используются для создания экземпляров или манипулирования статическими атрибутами.Расширенные классы140Абстрактные, листовые и полиморфныеэлементыОбобщениеобсуждается в главах5 и 10,экземпляры – в главе 13.Базовые понятияСообщенияобсуждаются в главе 16.Связи обобщения используются для моделирования структуры классов с более общими абстракциями, расположенными навершине иерархии, и более детальными – внизу. В пределах такойиерархии некоторые классы часто определяются как абстрактные –это значит, что они не могут иметь прямых экземпляров.
Например,на рис. 9.5 Icon (Пиктограмма), RectangularIcon (ПрямоугольнаяПиктограмма) и ArbitraryIcon (ПиктограммаПроизвольнойФормы) –абстрактные классы. В отличие от них, конкретные классы Button(Кнопка) и OKButton (КнопкаOK) могут сопровождаться экземплярами.Создавая новый класс, вы, вероятно, захотите, чтобы он наследовал свои свойства от других, более общих классов, а также имелпотомков – более специализированные классы, наследующие егосвойства.
Это нормальная семантика классов в UML. Впрочем, может случиться и так, что класс не должен иметь потомков. Такойэлемент называется листовым и обозначается в UML свойствомleaf, записанным под именем класса. Например, на рис. 9.5 OKButton –листовой класс.141Операции имеют аналогичные свойства. Обычно операция полиморфна, то есть вы можете специфицировать операцию с той жесигнатурой в разных местах иерархии классов. Операция в дочернем классе отменяет поведение такой же операции родительскогокласса (приоритетна перед ней).
Когда сообщение посылается вовремя исполнения, конкретная вызываемая операция выбирается изиерархии полиморфно – определяется во время исполнения соответственно типу объекта. Например, операции display (отобразить)и isInside (внутри) на рис. 9.5 полиморфны. Более того, операцияIcon::display() абстрактна: она не реализована в классе Icon и требуетот потомков предоставления собственных ее реализаций. В UMLимена абстрактных операций по аналогии с абстрактными классами выделяются курсивом. А вот Icon::getID() – листовая операция,на что указывает слово leaf.
Следовательно, она не полиморфна и неможет быть переопределена в классахFпотомках. В языке Java такиеоперации называются final (конечными).На заметку. Абстрактные операции UML в языке C++ называются пустыми виртуальными (pure virtual), листовые операции UML – невиртуальными (nonvirtual), а в Java – конечными (final).Множественностьабстрактный классабстрактная полиморфная операцияконкретная полиморфная операцияконкретная операцияРис.
9.5. Абстрактные и конкретные классы и операцииЭкземплярыобсуждаются в главе 13.Всякий раз при использовании класса имеет смысл предположить,что число его экземпляров не ограничено (если только он не является абстрактным и при нем не может быть непосредственных экземпляров, хотя экземпляры его потомков могут существовать в любомколичестве).
Иногда, однако, возникает необходимость ограничитьМножестколичество экземпляров класса, а еще чаще требуется указать, чтовенностьоно может равняться нулю (когда перед вами классFутилита, кототакжерый представляет только статические операции и атрибуты), едиявляетсянице (классFодиночка), определенному числу либо неопределенносвойствомму множеству (по умолчанию).ассоциацийВозможное число экземпляров класса называется множест(см. главенностью. Иными словами, множественность (multiplicity) – этовы 5 и 10).диапазон допустимых значений количества сущностей.
В UML выАтрибутысвязаны с се- можете указать множественность класса в выражении, находящемсяв правом верхнем углу пиктограммы класса. Например, на рис. 9.6мантикойассоциаций, NetworkController (КонтроллерСети) – класс9одиночка (singleton).как показано Кроме того, в системе должно быть ровно три экземпляра классав главе 10.ControlRod (РегулирующийСтержень).Расширенные классы142класс-одиночкаБазовые понятияАтрибуты всегда изменяемы, если только явно не указано другое. Если требуется сообщить, что значение атрибута не может бытьизменено после инициализации объекта, используйте свойст воreadonly. В основном это понадобится вам при моделировании констант или атрибутов, которые инициализируются при создании экземпляра и после этого не изменяются.множественностьНа заметку.
Свойство readonly соответствует свойству constв C++.Рис. 9.6. МножественностьМножественность устанавливается и для атрибутов: достаточно написать соответствующее выражение в квадратных скобкахсразу после имени атрибута. Так, из рис. 9.6 явствует, что внутриэкземпляра NetworkController может быть несколько экземпляровconsolePort.На заметку. Множественность класса имеет смысл в определенном контексте. На самом верхнем уровне это контекствсей системы. Вся система может рассматриваться как структурированный классификатор.ОперацииСигнатурыобсуждаются в главе 21.АтрибутыС цельюразличениянабороввзаимосвязанныхатрибутов(таких какслужебныеатрибуты)можноприменятьстереотипы – см.
главу 6.На самом абстрактном уровне при моделировании структурныхсвойств класса, то есть его атрибутов, вы просто пишете имена этихатрибутов. Обычно такой информации достаточно, чтобы среднестатистический пользователь понял назначение вашей модели.Однако можно ко всему прочему специфицировать видимость, область действия и множественность (см. предыдущие разделы), а также тип, начальное значение и изменяемость каждого атрибута.Полный синтаксис атрибута в UML выглядит так:[видимость] имя[‘:’ тип] [‘[‘ множественность ‘]’][‘=’ начальное значение][строка свойств {, строка свойств}]Приведем несколько примеров корректных объявлений атрибута:origin+ originorigin : Pointname : String[0..1]origin : Point = (0, 0)id : Integer {readonly}только имявидимость и имяимя и типимя, тип и множественностьимя, тип и начальное значениеимя и свойство143Дляобозначениянаборовсвязанныхопераций(таких каквспомогательныефункции)можно использоватьи стереотипы – см.главу 6.На самом высоком уровне абстракции при моделировании поведенческих свойств класса, то есть операций и сигналов, вы простоуказываете имя каждой операции.
Обычно этой информации достаточно, чтобы среднестатистический пользователь понял назначениемодели. Однако можно также специфицировать видимость и область действия каждой операции (как обсуждалось в предыдущихразделах), а кроме того, ее параметры, тип возвращаемого значения,семантику параллелизма и прочие свойства. Имя операции вместес ее параметрами, включая тип возвращаемого значения, если оноесть, называется сигнатурой операции.На заметку. Понятия «операция» и «метод» в UML различаются. Операция – это сервис, который может быть запрошен у любого объекта класса для реализации поведения,а метод – реализация операции. Каждой неабстрактной операции класса должен быть сопоставлен метод, который содержитисполняемый алгоритм в виде тела класса (обычно реализованного на некотором языке программирования или в виде структурированного текста).
В структуре наследования допускаетсямножество методов для одной и той же операции, и полиморфизм позволяет указать, какой метод из иерархии вызывается во время исполнения.Полный синтаксис операции в UML выглядит так:[видимость] имя [‘(‘ список параметров ‘)’][‘:’ тип возвращаемого значения][строка свойств {, строка свойств}]Приведем в качестве примера несколько корректных объявлений операции: displayтолько имя + displayвидимость и имяРасширенные классы144 set(n : Name, s : String) getID() : Integer restart() {guarded)Базовые понятиямогут осуществляться одновременно для одного объектана любых параллельных операциях, причем все должны обрабатываться параллельно, с корректной семантикой.
Параллельные операции следует спроектировать так, чтобыони корректно выполнялись при наличии параллельной,последовательной и защищенной операции на одном и томже объекте;5. static (статическая): операция не имеет неявного параметра –целевого объекта и ведет себя подобно традиционной глобальной процедуре.имя и параметрыимя и тип возвратаимя и свойствоВ сигнатуре операции вы можете указать ноль, один или несколько параметров, каждый из которых выражается следующимсинтаксисом:[direction] name : type [=defaultvalue]Направление (direction) может принимать одно из следующихзначений: in out inoutвходной параметр, не может быть модифицированвыходной параметр, может быть модифицировандля передачи информации вызывающему кодувходной параметр, может быть модифицировандля передачи информации вызывающему кодуНа заметку.