Дж. Рамбо, М. Блаха - UML 2.0 - Объектно-ориентированное моделирование и разработка (1158633), страница 16
Текст из файла (страница 16)
На111пЧАббгевв.ссвгоеег->аз5ег() В этом выражении мы переходим от объекта Мег(йапг к Рагс)(азе. Оператор зе1ест выбирает транзакции в рамках временного интервала, ограниченного а5гагШаге и апЕп(10аге. Возможность перехода по обобщению от Рите))азе к Ттапзасг)оп неявно поддерживается ОС). Для каждой из этих транзакций мы переходим к объекту 5гагетепг, затем к СгеЫСаг(1Ассоипд затем к Ма(1- )пйАй?те55 и, наконец, к Сизготел Ассоциация, связывающая Ма(1(пяАй?ге55 с Сизтотег, имеет тип многие-ко-многнм, поэтому в результате перехода получается мультимножество. Оператор а55ег преобразует мультимножество клиентов к обычному множеству (удаляет повторяющиеся элементы), что и дает нужный нам ответ.
° Сколько счетов для кредитных карт имеет конкретный клиент в данный момент? асс всоеег . Ма111пЧАббгевв. Сгеб1ССагбассоппс->з1ге () Для объекта класса Сииотег мы находим множество объектов Ма(1(пдАй6езт. Затем по множеству адресов мы находим множество объектов СгейгСагй Ассоипг. В результате этого перехода получается множество, а не мультимножество, потому что каждому счету соответствует ровно один адрес.
К множеству объектов Сге<ЫСап1Ассоипг мы применяем оператор ОС1. 5(ге, возвращающий число элементов множества. 3.6. Практические советы 71 ° Каков максимальный кредит для данного клиента по всем его счетам? аСпаеоаег.на111пдхббгеаа,СгебьГСагбхоооопе.еахгеиаСгебгг->поем Это выражение осуществляет переход от объекта Сизтотет к объекту Ма11- гпдАгЫгезз, затем к Сгег(1ГСагг1Ассоипт, в результате чего получается множество объектов СтеМСатйАссоипг. Для каждого из этих объектов определяется значение максимального кредита таптитСгейг, после чего полученные значения суммируются при помощи оператора ОС1. хит. Обратите внимание, что наши вопросы проверяют модель и позволяют обнаружить скрытые недостатки, которые затем можно будет устранить.
Например, запрос количества счетов для кредитных карт подразумевает, что нам может понадобиться каким-то образом отличать действующие счета от недействующих. Не забывайте о том, что ОС1. изначально разрабатывался как язык ограничений (см. главу 4). Однако, как вы уже видели, этот язык удобен и для прослеживания моделей. 3.6. Практические советы В этом разделе мы даем вам несколько советов, касающихся построения моделей классов. Эти советы мы вывели из собственного опыта по разработке приложений. Многие идеи уже упоминались в этой главе. ° Область задачи.
Не следует начинать моделирование классов с выписывания на листе списка классов и ассоциаций и построения иерархии наследования. Сначала необходимо понять задачу, требующую решения. Содержимое модели определяется решением задачи. Вам придется решать, какие объекты следует отразить в модели, а какие — нет. В модели отражаются только те аспекты, которые имеют непосредственное отношение к решению задачи (раздел 3.1.1). ° Простота.
Старайтесь создавать простые модели. Простая модель оказывается более доступной для понимания и требует меньше усилий со стороны разработчиков. Постарайтесь использовать минимальное количество классов, которые должны быть четко определены. Избегайте избыточности.
С подозрением относитесь к классам, которые сложно определить. Возможно, их лучше пересмотреть, а модель — реструктурировать. ° Компоновка диаграммы. Диаграмма должна быть построена таким образом, чтобы отражать симметрию решения. Чаще всего задача обладает сверхструктурой, которая не отражается самой системой обозначений. Постарайтесь располагать важные классы так, чтобы они выделялись на диаграмме. Старайтесь не допускать пересечения линий. ° Имена. Внимательно относитесь к выбору имен: они очень важны и несут в себе значительный скрытый смысл. Имена должны быть описательными, четкими и однозначными.
В именах не должен преобладать какой-либо аспект объекта. Выбор правильных имен — одна из наиболее сложных задач, 72 Глава 3 ° Моделирование классов стоящих перед разработчиком модели. В качестве имен классов следует ис- пользовать существительные в единственном числе. Ссылки. Не скрывайте ссылки на объекты в качестве атрибутов других объектов. Такие ссылки следует представлять ассоциациями. В этом слу- чае вы будете отражать истинную суть задачи, а не подход, который будет применен при реализации модели (раздел 3.2.1).
Кратность. Проверяйте полюса ассоциаций с кратностью «одним Часто наличие объекта на одном из полюсов оказывается необязательным и луч- ше будет указать кратность 0..1. В других случаях правильным оказывается значение «много» (раздел 3.2.2). Имена полюсов ассоциаций.
Аккуратно относитесь к неоднократному ис- пользованию одного и того же класса. Имена полюсов ассоциаций позво- ляют сделать ссылки на один класс единообразными (раздел 3.2.3). Мультимножества и последовательности. Обычная бинарная ассоциация позволяет создать не более одной связи между парой объектов. Однако вы можете разрешить установку нескольких связей между двумя объектами, обозначив полюс ассоциации словом (Ьаф или (зедиепсе) (раздел 3.2.5).
Атрибуты ассоциаций. На этапе анализа не допускайте помещения атри- бутов ассоциации в один из участвующих в ней классов. Модель должна непосредственно описывать объекты и связи между ними. На этапах про- ектирования и разработки вы всегда сможете разместить информацию там, где потребуется, чтобы сделать программу более эффективной (раз- дел 3.2.6). Квалифицированные ассоциации.
Проверяйте полюса ассоциаций с крат- ностью «много». Квалификатор часто может повысить точность ассоциа- ции и подчеркнуть важные направления навигации (раздел 3.2.7). Уровни обобщения. Избегайте глубокой вложенности иерархии обобще- ний (раздел 3.3.1). Подмена составляющих. Вы можете подменять методы и значения по умолчанию для атрибутов.
Однако не допускайте нарушения сигнатуры или семантики исходной унаследованной составляюгцей при ее подмене (раздел 3.3.3). Рецензии. Попросите кого-нибудь дать рецензию на вашу модель. Будьте готовы к тому, что она потребует пересмотра. При работе с моделями клас- сов часто приходится подбирать более четкие имена, улучшать абстракции, исправлять ошибки, добавлять сведения и добиваться более точной пере- дачи ограничений. Почти все наши модели прошли несколько редакций. Документация.
Всегда документируйте свои модели. На диаграмме отра- жается структура модели, но не могут быть отражены основания для ее по- строения. Объяснение, изложенное в письменном виде, направит читателя в нужную сторону и разъяснит ему тонкие моменты, определившие выбор конкретных конструкций. 3.7. Резюме по моделям классов 73 3.7. Резюме по моделям классов Модели классов описывают статические структуры данных, представленные объектами, и отношения между этими объектами. Содержимое модели определяется волей проектировщика и потребностями конкретного приложения. Объект — это концепция, абстракция или нечто, обладающее индивидуальностью, имеющее при этом смысл в рамках приложения.
Класс описывает группу объектов с одинаковыми атрибутами, поведением, видами отношений и семантикой. Атрибут— это именованное свойство класса, описывающее значение, хранимое каждым объектом данного класса. Операция — это функция или процедура, которая может быть применена к объекту класса или вызвана им. Связь — это физическое или концептуальное соединение между объектами. Связь является экземпляром ассоциации.
Ассоциация — это описание группы связей с одинаковой структурой и семантикой. Ассоциация описывает множество потенциальных связей точно так же, как класс описывает множество возможных объектов. Ассоциация — это логическая конструкция, одной из возможных реализаций которой является ссылка. Существуют и другие способы реализации ассоциаций. Полюс ассоциации может иметь имя и кратность. Кратность определяет количество экземпляров одного класса, которые могут быть связаны с одним экземпляром другого класса данной ассоциацией.
Класс ассоциации — это ассоциация, которая одновременно является классом. Класс ассоциации может иметь атрибуты и операции и может участвовать в других ассоциациях. Квалифицированная ассоциация характеризуется тем, что объекты, находящиеся у полюса с кратностью «много», частично или полностью отделяются друг от друга при помощи атрибута, называемого квалификатором. Квалификатор позволяет выбрать один из целевых объектов, в результате чего эффективная кратность ассоциации снижается (чаще всего со значения «много» до значения «один»).
Часто квалификаторами служат имена. Обобщение — это отношение между классом (суперклассом) и его разновидностями (подклассами). Обобщение упорядочивает классы по подобию и различиям, благодаря чему структурируется описание объектов. Подкласс наследует атрибуты, операции и ассоциации суперкласса. Благодаря наследованию подкласс может повторно использовать составляющие суперкласса, а при необходимости— подменять их. Подкласс может также добавлять новые свойства. Обобщение важно не только для концептуального моделирования, но и для реализации. На первом этапе обобщение позволяет разработчику упорядочить классы.
На этапе реализации наследование способствует полиморфизму и повторному использованию кода. Наследование образовывает иерархию с произвольным числом уровней, в которой каждый уровень будет отражать один аспект объекта. Объект объединяет атрибуты, операции и ассоциации с каждого уровня иерархии обобщений. Модели классов полезны не только для определения структур данных. Прослеживание моделей классов позволяет вам выразить некоторые виды поведения.