Джим Арлоу, Айла Нейштадт - UML 2 и Унифицированный процесс. Практический объектно-ориентированный анализ и проектирование (1037782), страница 75
Текст из файла (страница 75)
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.
Например, на рис. 18.20 класс Borrower играет роль borrowers в своей ассоциации с LibraryManager. А на рис. 18.21эта роль была уточнена и превратилась в более конкретные роли под41318.13. Что мы узналиклассов Borrower, student и staff. Как правило, некоторые роли ассоциаций проецируются в роли частей, а некоторые – нет.Аналогично соединители могут проецироваться в ассоциации междуклассами или только во временные отношения, созданные в контекстеструктурированного класса.
В этом простом примере каждый соединитель может быть отображен в ассоциацию.Внутреннюю структуру структурированных классификаторов можнопредставить как на диаграмме классов, так и на специальной диаграмме, которую называют диаграммой составных структур (compositestructure diagram). Имя диаграммы соответствует имени структурированного классификатора, а содержимое диаграммы – это содержимоеструктурированного классификатора.
На рис. 18.22 изображена диаграмма составных структур класса LibraryManager.диаграмма составных структурLibraryManagerstudent:StudentBorrower[0..*]studentLoan:Loan[0..4]staff:StaffBorrower[0..*]0..*1:Book[0..*]10..*staffLoan:Loan[0..8]:Librarian[1..*]loggedOnLibrarian:Librarian[0..1]Рис. 18.22. Диаграмма составных структур класса LibraryManager18.13. Что мы узналиВ этой главе было показано, как выявленные при анализе отношенияпреобразуются в отношения уровня проектирования, которые ужеможно реализовывать. Мы узнали следующее.•Уточнение аналитических отношений до отношений уровня проектирования включает:•уточнение ассоциаций до агрегации или композитной агрегациив соответствующих случаях;414Глава 18. Уточнение отношений, выявленных при анализе•••••••реализацию классовассоциаций;реализацию ассоциаций одинкомногим;реализацию ассоциаций многиекодному;реализацию ассоциаций многиекомногим;реализацию двунаправленных ассоциаций;введение возможности навигации;••введение кратности на обоих концах ассоциации;введение имени роли на обоих концах ассоциации или, по крайней мере, на целевом конце;• использование структурированных классификаторов.Агрегация и композиция.• Это отношения типа целоечасть, где объекты одного класса играют роль целого, или агрегата, а объекты другого класса играют роль частей:•••••целое использует сервисы частей; части обслуживают запросы целого;• целое является доминирующей, контролирующей сторонойотношения; часть обычно играет более пассивную роль.Эти отношения транзитивны – если C является частью B и B является частью A, тогда C является частью A.Эти отношения асимметричны:• целое никогда – ни прямо, ни косвенно – не может быть частью самого себя;• циклы в схеме агрегации недопустимы.Существует два типа отношения агрегации:• агрегация;• композитная агрегация – обычно ее называют просто композицией.Агрегация.• Семантика агрегации:• агрегат может зависеть от частей, а иногда может существовать независимо от них;• части могут существовать независимо от агрегата;• агрегат является несколько неполным в случае отсутствия некоторых частей;• несколько агрегатов могут владеть частями совместно;• возможны иерархии и сети агрегации;• целое всегда знает о существовании частей, но если отношениеоднонаправленное, от целого к части, части не знают о целом.18.13.