Дж. Арлоу, А. Нейштадт - UML 2 и Унифицированный процесс - Практический объектно-ориентированный анализ и проектирование (1158625), страница 75
Текст из файла (страница 75)
Если бы между B и A было применено отношение агрегации, объект b был бы частью (через композицию или агрегацию) объекта а, и объект а был бы частью (через агрегацию) объекта b. Такое замкнутое владение, конечно же, нарушает асимметричность агрегации.Двунаправленные ассоциации также имеют место тогда, когда целоепередает ссылку на себя в качестве параметра одной из операций частиили когда часть в одной из своих операций создает экземпляр целого.В этих случаях необходимо использовать отношение зависимости отчасти к целому, а не ассоциацию.анализA1*«trace»проектированиеB«trace»1*1*ABРис.
18.17. При проектировании двунаправленная ассоциацияконкретизируется в две однонаправленные ассоциации408Глава 18. Уточнение отношений, выявленных при анализе18.11.3. КлассыассоциацииКлассыассоциации – исключительно аналитические артефакты, которые напрямую не поддерживаются ни одним из широко используемых ОО языков программирования. Таким образом, они не имеют прямого аналога в проектировании и должны быть удалены из проектноймодели.Классассоциация конкретизируется в обычный класс, а для отражения его семантики используется сочетание ассоциации, агрегации,композиции или даже зависимости. Это может потребовать наложения ограничений на модель. Принимается решение, какая из сторонассоциации является целым, и соответственно этому используетсякомпозиция, агрегация и возможность навигации. Пример показан нарис.
18.18.анализCompany**PersonJobsalary:double«trace»1Company**1PersonJobпроектированиеsalary:double{каждый человек (Person) в даннойкомпании (Company) может заниматьтолько одну должность (Job)}Рис. 18.18. Пример конкретизации класса+ассоциацииОбратите внимание, что при конкретизации классаассоциации теряется его семантика, которая гласит, что объекты на каждом концеклассаассоциации должны формировать уникальную пару (см.
раздел 9.4.5). Однако, как показано на рис. 18.18, добавив примечание,содержащее соответствующее ограничение, эту семантику можно безтруда восстановить.18.12. Изучение композиции с использованием структурированных классов40918.12. Изучение композиции с использованиемструктурированных классовДо сих пор мы брали отношения, выявленные при анализе, и превращали их в одно или более отношений уровня проектирования. В этом состоит основная деятельность в уточнении отношений уровня анализа.Однако UML 2 также позволяет анализировать отношение между составным классификатором и его частями. Это может быть важной частью деятельностей UP Проектирование класса, Проектирование прецедентаи Проектирование подсистемы, поскольку позволяет сосредоточить внимание на внутренних действиях одного из этих классификаторов.
Основным понятием здесь является структурированный классификатор,который рассматривается в следующем разделе.18.12.1. Структурированные классификаторыСтруктурированный классификатор – это классификатор, имеющий внутреннюю структуру.Структурированный классификатор (structured classifier) – это простоклассификатор (такой как класс), имеющий внутреннюю структуру.Эта структура моделируется как части, объединенные с помощью соединителей. Взаимодействие структурированного классификаторас его окружением моделируется его интерфейсами и портами, но мыотложим их обсуждение до главы 19.Часть – это роль, которую могут выполнять один или более экземпляров классификатора в контексте структурированного классификатора. Каждая часть может иметь:• имя роли – описательное имя роли, исполняемой экземплярамив контексте структурированного классификатора;• тип – только экземпляры этого типа (или подтипа этого типа) могутиграть эту роль;• кратность – число экземпляров, которые могут играть роль в любойконкретный момент времени.Соединители – это отношения между ролями (частями).
Соединителии части существуют только в рамках контекста конкретного структурированного классификатора.Соединитель (connector) – это отношение между частями в контекстеструктурированного классификатора. Он указывает на то, что частимогут общаться друг с другом и что между экземплярами, играющимироль частей, через которые это общение может происходить, существует отношение.
Эти отношения могут проецироваться в ассоциациимежду классами частей. Или они могут быть просто специальными от410Глава 18. Уточнение отношений, выявленных при анализедиаграмма классовStructuredClassSyntaxструктурированный классSomeClassимя ролитипpart1:T ype1[0..2]кратность1соединитель*part2:Type2[*]частиРис. 18.19. Синтаксис структурированного классификатораношениями, при которых структурированный классификатор объединяет части во временную кооперацию для осуществления некоторойзадачи.Синтаксис структурированного классификатора показан на рис.
18.19на примере класса SomeClass (некоторый класс).Основные моменты синтаксиса структурированного классификатора:• части кооперируются в контексте структурированного классификатора;• части представляют роли, которые могут играть экземпляры классификатора в контексте структурированного классификатора –части не представляют классы;• соединитель – это отношение между двумя частями, которое указывает на то, что экземпляры, играющие роли, определенные частями, могут общаться некоторым образом.Из этого списка видно, что при моделировании структурированногоклассификатора учитываются только внутренняя реализация и внешний интерфейс одного классификатора.
Все классификаторы, не являющиеся частями структурированного классификатора, игнорируются. Таким образом, это очень узкоспециализированная техника моделирования.18.12.2. Структурированные классыСтруктурированный класс имеет дополнительное ограничение: он владеет всеми своими частями, соединителями и портами (см. раздел 19.6).Между ними и классом устанавливается неявное отношение включения.Давайте рассмотрим пример использования структурированных классов на практике. На рис. 18.20 показана диаграмма классов для прос41118.12. Изучение композиции с использованием структурированных классовLibraryManagementSystem0..*1LoanBookborrowedBookloans0..*0..*1Borrower1borrowers0..*StudentBorrower{число книг на руках = 4}catalogLibraryManager1StaffBorrowerLibrarian11..*{одновременно только одинбиблиотекарь (Librarian) можетбыть зарегистрирован в системе}{число книг на руках = 8}Рис.
18.20. Диаграмма классов для системы управления библиотекойтой системы управления библиотекой. На нее наложены следующиебизнесограничения:•существует два типа класса Borrower (читатель) – StudentBorrower (читательстудент) и StaffBorrower (читательсотрудник);•у StudentBorrower одновременно на руках может быть максимум четыре книги;•у StaffBorrower одновременно на руках может быть максимум восемькниг;•одновременно в системе может быть зарегистрирован только одинLibrarian (библиотекарь) – это однопользовательская система.Все атрибуты и операции на этом рисунке скрыты, потому что основное внимание направлено на аспекты структуры системы.Как видите, у класса LibraryManager (менеджер библиотеки) есть внутренняя структура – сочетание Borrower, Book и Librarian.
Изза транзитивной природы композиции классы Loan (выдача) также являются частьюэтой составной структуры. Класс LibraryManager можно представить какструктурированный класс, как показано на рис. 18.21. Обратите внимание, что классы StudentBorrower и StaffBorrower тоже отображены какструктурированные. Кстати, структурированные классы могут бытьвложенными с любым уровнем вложенности.412Глава 18. Уточнение отношений, выявленных при анализеLibraryManager implementation:LibraryManagerstudent:Borrower[0..*]studentLoan:Loan[0..4]staff:Borrower[0..*]0..*1:Book[0..*]10..*staffLoan:Loan[0..8]:Librarian[1..*]loggedOnLibrarian:Librarian[0..1]Рис.
18.21. Структурированный класс LibraryManagerРисунок 18.21 дает несколько другое представление системы и позволяет взглянуть на класс LibraryManager немного подробнее, рассмотревроли, исполняемые экземплярами класса в его реализации.•С точки зрения менеджера библиотеки (LibraryManager) существуетдва типа читателей (Borrower), которые обрабатываются немного поразному исходя из максимального количества выданных книг(Loan). Чтобы представить это, вводятся новые роли – student (студент) и staff (штат).•У student и staff может быть разное максимальное количество невозвращенных Loan в любой момент времени.
Чтобы показать это, создаются две разные роли Loan – studentLoan и staffLoan – и для каждойиз них вводится соответствующая кратность.•LibraryManager допускает одновременную регистрацию в системетолько одного Librarian, поэтому введена роль loggedOnLibrarian (зарегистрированный библиотекарь) с кратностью 0..1.Некоторые роли ассоциаций могут проецироваться в роли частей.Как видите, мы смогли явно представить внутренние роли, исполняемые экземплярами в рамках контекста класса LibraryManager. Заметьте,что эти роли могут отличаться от ролей, исполняемых классами в ихассоциациях с LibraryManager.