2. Язык UML. Руководство пользователя. Буч_ Рамбо_ Якобсон (2-е издание) (2006) (1185732), страница 15
Текст из файла (страница 15)
Моделирование примитивных типовПо рис. 4.12 видно, что эти сущности могут быть смоделированына UML как типы или перечисления, которые изображаются как классы, но с явно отмеченными стереотипами. Примитивные типы, такиекак целые числа (представленные классом Int), моделируются кактипы, и вы можете явно указать диапазоны их допустимых значений,используя ограничения; семантика примитивных типов должна бытьопределена вне UML. Перечислимые типы, скажем Boolean (Булев)Классы74и Status (Состояние) могут быть смоделированы перечислениямисо своими собственными индивидуальными литералами, указанными в разделе атрибутов (отметим, однако, что атрибутами они не являются).
Перечислимые типы также могут определять операции.На заметку. Некоторые языки, в частности C и C++, позволяют устанавливать целые значения для литералов перечислений. Вы можете смоделировать эти значения на UML, добавив комментарий к описанию литерала перечисления. Однакодля логического моделирования целые значения не нужны.Глава 5. СвязиВ этой главе:Советы и подсказкиМоделируя классы на UML, помните, что каждый класс долженотображать некоторую осязаемую или концептуальную абстракциюиз предметной области конечного пользователя или разработчика.Хорошо структурированный класс обладает следующими признаками: представляет четкую абстракцию понятия из словаря проблемной области или области решения; включает краткий, четко выраженный набор обязанностейи справляется с ними наилучшим образом; представляет четкое разделение спецификации и реализации этой абстракции; понятен и прост, но при этом является расширяемым и адаптируемым.Изображая класс в UML, вы должны: показать только те его свойства, которые важны для понимания абстракции в данном контексте; организовать длинные списки атрибутов и операций, группируя их по категориям; представить взаимосвязанные классы на одной диаграмме.Связи: зависимости, обобщения и ассоциацииМоделирование простых зависимостейМоделирование одиночного наследованияМоделирование структурных связейСоздание сетей связейНаучившись строить абстракции, вы быстро замечаете, что оченьнемногие классы существуют сами по себе.
Наоборот, большинствоиз них кооперируется с другими самыми разными способоами. Поэтому при моделировании системы вы не только должны идентифицировать сущности, формирующие ее словарь, но и смоделироватьотношения их друг к другу.БолееВ объектноFориентированном моделировании существуют триразвитыевида связей между классами, которые наиболее важны: зависимость,виды связейпредставляющая связи использования между классами (включаяобсуждают- уточнение, трассировку и связывание); обобщение, которое связывася в главе 10. ет обобщенные классы с их специализациями; ассоциации, описывающие структурные связи объектов. Каждая из этих разновидностейпредставляет отдельный способ комбинирования абстракций.Построение сетей связей не сильно отличается от созданиясбалансированного распределения обязанностей между классами:если вы усложните их, то запутанный клубок связей сделает вашумодель непонятной; если же чрезмерно упростите, то лишитесь всего того богатства возможностей, которое обеспечила бы вашей системе кооперация.Связи76ВведениеВернемся к метафоре строительства дома.
Стены, двери, окна,встроенные шкафы и системы освещения формируют часть вашегословаря. Однако ни одна их этих вещей не существует в отдельности: одна стена соединяется с другими, двери и окна вмонтированыв стены, открывая в них проемы, встроенные шкафы и системы освещения крепятся к стенам и потолкам. И все эти объекты – стены,двери, окна, шкафы и осветительные приборы – в совокупностиформируют более высокоуровневые сущности (комнаты).Тем не менее вы обнаружите между этими сущностями не только структурные, но и иные связи.
Например, ваш дом имеет окна,но они могут быть неодинаковы. У вас может быть большое окнов гостиной, которое не открывается, и маленькое кухонное, котороеоткрывается. Некоторые окна открываются вверх или вниз; другие(скажем, патио) сдвигаются влево или вправо. Далее, рама бывает одинарной или двойной и т.д. Но независимо от этих различий,в каждом окне присутствует некоторый признак «оконности»: всеони открывают проем в стене и предназначены для того, чтобы пропускать свет, воздух, а иногда даже людей.В UML способы соединения сущностей друг с другом, логические либо физические, моделируются связями.
В объектноFориентированном моделировании существует три типа наиболее важныхсвязей: зависимости, обобщения и ассоциации.1. Зависимость представляет собой связь использования. Например, трубы зависят от водонагревателя для подогреваводы, которая по ним передается.2. Ассоциация – это структурная связь между экземплярами.Например, комнаты состоят из стен и других объектов; в стены вмонтированы двери и, возможно, окна; через стены могут тянуться трубы.3. Обобщение связывает обобщенные классы с более специализированными и потому известны как связи наследования(«классFподкласс», или «родительFпотомок»). Например, витраж – это окно с очень большими, жестко фиксированными панелями; патио – разновидность окна, открывающегосявбок.Другие видыЭти три вида связей описывают большинство основных спосвязей,собов взаимодействия сущностей.
Неудивительно, что они хоротакие какшо проецируются и на те способы, которые предусмотрены больреализацияшинством объектноFориентированных языков для соединенияи уточнение, объектов.обсуждаютКак показано на рис. 5.1, UML предлагает особое графическоеся в главе 10. представление для каждого вида связи.
Эта нотация позволяетБазовые понятия77визуализировать связи независимо от конкретного языка программирования, причем способом, описывающим наиболее важные параметры связей: имя, соединяемые сущности и свойства.Рис. 5.1. СвязиБазовые понятияСвязь (relationship) – это соединение сущностей. В объектноFориентированном моделировании есть три наиболее важных вида связей: зависимости, обобщения и ассоциации. Связь изображаетсяв виде пути с использованием разнообразных типов линий, каждыйиз которых соответствует определенному виду связи.ЗависимостиЗависимость (dependency) – это связь, которая устанавливает,что одна сущность, например класс Window (Окно), использует информацию и сервис (операцию либо услугу), представляемые другойсущностью, например классом Event (Событие), но не обязательно – наоборот.
Зависимость изображается в виде пунктирной линии со стрелкой, направленной на зависимую сущность. Выбирайте зависимость,когда вам нужно показать, что одна сущность использует другую.ПримечанияЧаще всего вы будете применять зависимости для того, чтообсуждают- бы показать, что один класс использует операции другого классася в главе 6,(либо использует переменные или аргументы типа другого класпакеты –са) – см. рис. 5.2.
Это очень похоже на связь использования: еслив главе 12.используемый класс изменяется, это может затронуть операциидругих классов, поскольку используемый класс теперь может предоставлять другой интерфейс или поведение. UML допускает создание зависимостей и между другими элементами, в частности междупримечаниями и пакетами.Связи78Базовые понятияПакеты обсуждаютсяв главе 12.79Чаще всего вы будете использовать обобщения между классамии интерфейсами, чтобы отобразить связь наследования. Кроме того,в UML можно описать обобщение между другими элементами, например узлами.ShapeРис. 5.2. Зависимостиorigin: РointРазныеформы зависимостейобсуждаются в главе 10,стереотипы – в главе 6.На заметку.
Зависимость может быть поименована, хотя такиеимена редко требуются на практике, если только вы не моделируете слишком много зависимостей, которые иначе было бытрудно отличать друг от друга. Чаще для того, чтобы подчеркнуть различия между зависимостями, используют стереотипы.move (offset: Point)resize (ratio: Real)display()ОбобщенияОбобщение (generalization) – это связь между сущностью общего характера (называемой суперклассом, или родителем) и болееспецифичной сущностью (называемой подклассом, дочерним классом или потомком). Иногда обобщение называют связью типа «является»: к примеру, класс BayWindow (ОкноF«фонарь») является разновидностью более общей сущности, класса Window (Окно).
Объектыдочернего класса могут быть использованы как переменные или параметры типа его родителя, но не наоборот. Другими словами, дочерняя сущность может быть подставлена там, где объявлена родительская. Дочерняя сущность наследует свойства родителя, а именноего атрибуты и операции. Часто, хотя и не всегда, потомок имеет дополнительные атрибуты и операции помимо родительских. Реализация операции в дочернем классе замещает реализацию той же операции родителя – это явление называется полиморфизмом. Одинаковыеоперации должны иметь одинаковую сигнатуру (имя и параметры).Графически обобщение представлено сплошной линией со стрелкой в форме большого пустого треугольника, указывающей на родителя (см. рис.
5.3). Используйте обобщение, когда необходимоизобразить связь «родительFпотомок».Класс может одного или нескольких родителей либо не иметьих вовсе. Класс, не имеющий родителей, но имеющий одного илинескольких потомков, называется корневым (root) или базовым.Класс, не имеющий потомков, называется листовым (leaf). О классе, у которого есть только один родитель, говорят, что он используетодиночное наследование, в отличие от класса, у которого более чемодин родитель (множественное наследование).width: Distanceheight: DistanceРис.
5.3. ОбобщениеНа заметку. Обобщение с именем означает декомпозицию суперкласса на подклассы в какомQто определенномаспекте, называемом набором обобщения (generalization set).Множественные наборы обобщения ортогональны; суперклассможет быть специализирован с применением множественного наследования для выбора одного подкласса из каждогонабора обобщения. Это отдельная тема, которую мы не планировали раскрывать в рамках данной книги.Ассоциациии зависимости(но не обобщения) могут бытьрефлексивными (см.главу 10).АссоциацииАссоциация – это структурная связь, указывающая, что объекты одной сущности соединяются с объектами другой.