2. Язык UML. Руководство пользователя. Буч_ Рамбо_ Якобсон (2-е издание) (2006) (1185732), страница 17
Текст из файла (страница 17)
Каждый из этих четырех специализированных классовпредставляет собой некоторую разновидность Security. Последнийвключает две операции: presentValue (текущаяСтоимость) и history(История). Поскольку Security является родителем CashAccount,Stock, Bond и Property, все они наследуют эти две операции, равно каки любые другие атрибуты и операции Security, которые могут бытьне указаны на этом рисунке.АбстрактИмена Security и presentValue написаны курсивом не случайно. Когные классыда вы строите иерархии, подобные той, что представлена на рис.
5.10,и операциито часто сталкиваетесь с нелистовыми классами, которые неполныобсуждают- или для которых не может существовать объектов. Такие классыся в главе 9.называются абстрактными. В UML вы можете пометить класс какабстрактный, написав его имя курсивом. То же касается и операций:в рассматриваемом примере операция presentValue имеет сигнатуру,Связи86но не реализуется в классе Security и должна быть реализованав виде методов на более низком уровне абстракции, поэтому ее имятакже выделено курсивом. Зато все четыре непосредственных потомка Security являются конкретными (то есть не абстрактными),а значит, каждый из них обязан представить конкретную реализацию операции presentValue.Иерархии обобщения/специализации не обязательно ограничиваются двумя уровнями. Обычно этих уровней больше, и рис.
5.10служит тому подтверждением. SmallCapStock (АкцияСМалымКапиталом) и LargeCapStock (АкцияСБольшимКапиталом) – потомки класса Stock, который, в свою очередь, является дочерним по отношениюк Security. Таким образом, Security – корневой класс, поскольку онне имеет родителей. SmallCapStock и LargeCapStock – листовые классы,потому что не имеют потомков. Stock имеет как родителя, так и потомков; он не подходит под определение ни корневого, ни листового класса.МножестХотя это и не показано здесь, вы можете создавать классы с невенное насколькими родителями.
Это называется множественным наследованием и означает, что классуFпотомку передаются все атрибуты,следованиеобсуждает- операции и ассоциации его родителей.Конечно, в системе наследования не может быть циклов: ни одинся в главе 10.класс не может быть своим собственным предком.Моделирование структурных связейАссоциациипо умолчанию двунаправленны,но вы можете ограничить ихнаправленность (см.главу 10).При использовании связей зависимости или обобщения вы можете моделировать классы, которые находятся на разных уровняхважности либо разных уровнях абстракции. В случае зависимостимежду двумя классами один класс зависит от другого, но этот последний ничего не знает о первом. В случае же обобщения междуклассами потомок наследует свойства родителя, но родитель не содержит никаких конкретных сведений о своих потомках.
Инымисловами, связи зависимости и обобщения асимметричны.Моделируя ассоциации, вы имеете дело с классами, находящимися на одном уровне. Два класса, вовлеченные в ассоциацию,некоторым образом связаны друг с другом, и часто вы можете осуществлять навигацию по этой связи в любом направлении.В то время как зависимость – связь использования, а обобщение – связь наследования, ассоциация определяет структурныйпуть взаимодействия объектов двух классов.Чтобы смоделировать структурные связи, воспользуйтесь следующими рекомендациями: Установите ассоциацию между каждой парой классов, по объектам которых следует обеспечить навигацию. Это основанноена данных представление ассоциации.Типичные приемы моделированияВариантыиспользования обсуждаютсяв главе 17.87 Установите ассоциацию между каждой парой классов, объектыодного из которых нуждаются во взаимодействии с объектами другого (но не в виде локальных переменных в процедуреили параметров операции).
Это в основном поведенческоепредставление ассоциации. Для каждой из установленных ассоциаций специфицируйтемножественность, особенно когда она не выражается символом * (звездочка), принятым по умолчанию, а также именаролей, особенно если они помогают объяснить модель. Если класс на одном конце ассоциации структурно или организационно представляет целое, в то время как класс, находящийся на другом конце, является частью этого целого,пометьте такую связь как агрегацию (то есть добавьте к связывающей их линии ромбик со стороны целого).Как вы можете узнать, когда объекты одного класса должны взаимодействовать с объектами другого? Ответ – когда CRCFкарточкии анализ на основе вариантов использования заставляют вас рассмотреть структурные и поведенческие сценарии.
Если вы обнаруживали, что какиеFлибо классы взаимодействуют, используя связипо данным, установите между ними ассоциацию.Рис. 5.11 показывает набор классов информационной системыучебного заведения. Перечислим эти классы начиная с нижнеголевого угла диаграммы: Student (Студент), Course (Курс) и Instructor(Преподаватель). Существует ассоциация между Student и Course,свидетельствующая о том, что студенты посещают курсы. Болеетого, каждый студент может посещать многие курсы и каждый курсможет быть прочитан для многих студентов.
Также вы обнаружите ассоциацию между Course и Instructor, которая говорит о том, чтопреподаватели ведут курсы. Для каждого курса назначен как минимум один преподаватель, причем каждый преподаватель можетвести один или несколько курсов либо не вести ни одного. Каждыйкурс относится исключительно к одному факультету.Рис. 5.11. Структурные связиСвязи88Агрегациямежду классами Schoolи Departmentпредставляет собойкомпозицию.Композиция – этоболее строгая формаагрегации,подразумевающаямонопольноевладение (см.главу 10).Связи между классом School (Учебное заведение) и классамиStudent и Department (Факультет) немного иные.
Здесь вы видите примеры агрегаций. Вуз может набрать или не набрать студентов; каждый студент может быть зарегистрирован в одном или несколькихвузах; в вузе имеется один или несколько факультетов, причем каждый относится исключительно к одному учебному заведению. Выможете опустить дополнительные символы агрегации и применятьпростые ассоциации, но, специфицируя School как целое, а Studentи Department – как его части, вы тем самым проясняете, что по отношению к чему является главным. По рисунку видно, что учебныезаведения в какомFто смысле определяются его студентами и факультетами. Впрочем, студенты и факультеты тоже не существуютсами по себе, вне вуза, к которому они прикреплены. Они получают свой статус только в связи с учебным заведением (так, человек,не учащийся в вузе, лишается права именоваться студентом).Кроме того, существуют две ассоциации между Department и Instructor. Одна из них показывает, что каждый преподаватель работаетна одном или нескольких факультетах и каждому факультету сопоставлен один или несколько преподавателей.
Эта связь моделируется как агрегация, поскольку организационно факультеты в структуре учебного заведения находятся выше, чем преподаватели. Втораяассоциация, установленная для каждого факультета, говорит о том,что на факультете есть один начальник – преподаватель, занимающий должность декана. Из приведенной модели явствует, что преподаватель может быть деканом не более чем на одном факультете,а некоторые преподаватели не являются деканами ни одного факультета.На заметку. Модель, приведенная на рис. 5.11, не являетсяединственно приемлемой. К примеру, учебное заведение можетне иметь факультетов. Декан не всегда является преподавателем, а иногда даже встречаются преподавателиQстуденты.
Всеэто не значит, что рассматриваемая нами модель не идеальна,она просто представляет один из возможных вариантов организационной структуры вуза. Каждая ваша модель, подобнаяэтой, будет строиться исходя из конкретных условий.Советы и подсказкиМоделируя связи на UML, соблюдайте следующие правила: используйте зависимости только тогда, когда моделируемыесвязи не являются структурными;Советы и подсказки89 используйте обобщение, только когда оно выражает связьтипа «является». Множественное наследование часто можетбыть заменено агрегацией; избегайте циклических связей обобщения; старайтесь обеспечить сбалансированность связей обобщения.Цепочки наследования не должны быть ни слишком длинными (глубина более четырех уровней уже нежелательна),ни слишком широкими (ищите возможность создания промежуточных абстрактных классов); при наличии структурных связей между объектами используйте главным образом ассоциации.
Но не применяйте ихдля того, чтобы выразить временные связи, например в параметрах или локальных переменных процедур.Представляя связи в UML графически, не забывайте о следующем: согласуйте в модели прямоугольные и наклонные линии.Прямоугольные линии визуально выражают соединение связанных сущностей с одним общим родителем.
Наклонные линии часто позволяют сэкономить пространство на сложныхдиаграммах. Применение линий обоих типов на одной диаграмме удобно для привлечения внимания к разным группамсвязей; избегайте пересекающихся линий там, где можно без нихобойтись; показывайте только те связи, которые нужны для понимания определенной группы сущностей.
Излишние связи (особенно избыточные ассоциации) нежелательны.Введение91ВведениеГлава 6. Общие механизмыВ этой главе:Общиемеханизмытакжеобсуждаются в главе 2.ПримечанияСтереотипы, помеченные значения и ограниченияМоделирование комментариевМоделирование новых строительных блоковМоделирование новых свойствМоделирование новой семантикиРасширения UMLРабота с UML значительно упрощается благодаря наличию четырех общих механизмов, которые используются в языке повсеместно:спецификаций, дополнений, общих средств разделения и средстврасширения. Настоящая глава посвящена двум из них: дополнениям и средствам расширения.Примечание – наиболее важное из дополнений, которое можетсуществовать и обособленно.