Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методы и средства проектирования информационных систем и технологий. Основы UML. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
детали того, используется ли сортировка кучи, быстрая сортировка, сортировка по пузырькам, сортировка по вставке или какой-либо другой тип сортировки. Это позволит изменить способ сортировки в зависимости от типа задачи. Если пользователи знали о вашем намерении относительно того, какой алгоритм сортировки вы планируете использовать, они бы зависели от его характеристик.
Инкапсуляция – это метод, в котором детали, которые необходимо скрыть (из-за скрытия информации), но которые зависят друг от друга, размещаются
вместе. Поэтому, если одна деталь должна измениться, всё, что от неё зависит, размещается рядом, чтобы они могли меняться одновременно. Поэтому, если нужно что-то изменить, связанные изменения не распространяются по всей системе, а ограничиваются одной диаграммой и ограниченным количеством элементов.
В моделировании UML, как и в объектно-ориентированной методологии, часто моделируется целый объект, который состоит из множества частей, при этом операции можно применять как к целому, так и к деталям. Поэтому, если вы покупаете, ездите или угоняете автомобиль, вы также покупаете, управляете и угоняете двигатель, шасси, колёса, фактически все детали автомобиля. UML предоставляет несколько методов, которые поддерживают спецификацию структур цельной детали в модели.
Композиция – это прочные отношения целой части, где часть обычно не может существовать без целого, а часть не может быть частью более чем одно­го целого за один раз. Физические взаимоотношения между собой, как правило, являются композициями. Двигатель может быть частью только одного автомо­биля одновременно.
Агрегация – более слабая форма, где часть может быть частью целого. На- пример, ученик может быть частью более чем одной школы.
В UML-моделировании, как и в объектно-ориентированной методологии, вы часто обнаруживаете, что моделируете отдельные вещи, а затем моделируе­те более абстрактную, обобщенную версию этих вещей.
21

2. ОБЪЕКТЫ И КЛАССЫ

Классы являются наиболее распространённым элементом моделирования UML во всех проектах. Другие элементы моделирования описывают некоторое
поведение, внутреннюю структуру, расположение, отношения или организацию одного или нескольких классов с разных точек зрения.
На уровне реализации это объекты, которые выполняют действия, но даже там классы определяют особенности (свойства и поведение), которые демонст­рируют объекты.
Классы также могут рассматриваться как общий знаменатель для описания набора. В нематематическом смысле множество – это совокупность элементов, которые имеют что-то общее. Каждый из элементов набора является объектами. Ряд президентов США содержит примеры Джорджа Вашингтона, Томаса Джефферсона и Авраама Линкольна (среди других), с некоторыми областями имени, даты рождения, года избрания и политической партии. Каждый элемент набора, т.е. каждый объект, будет иметь значения для этих полей. Класс также можно рассматривать как таблицу базы данных со связанными определениями полей. Каждый объект будет экземпляром строки (также называемой записью) таблицы со значениями, разрещёнными для каждого поля. В этих случаях каж­дое имя поля указывает атрибут.
Поскольку классы являются основными элементами в UML и многих объ­ектно-ориентированных языках программирования (OOPL), нам необходимо знать, как найти классы, которые будут требоваться для проекта. Чтобы сделать это правильно, нам нужно определить, что эти классы будут являться объектами.
В некоторых случаях выбор объектов относительно прост. Исследуя ре­альный мир, можно отметить соответствующие объекты реального мира, обыч­но очевидные, потому что можно указать на них, манипулировать ими и на­звать их. В библиотеке каждая книга имеет такие свойства, как имя, автор, из­датель, авторские права и номер каталога. Каждая книга отличается от других
22
книг, даже если они имеют идентичные свойства, поскольку каждая книга су­ществует отдельно. Мы можем манипулировать каждой книгой. Каждая книга может быть выдана, возвращена, отозвана, уничтожена.
Объекты, которые не являются физическими, идентифицировать сложнее.
Некоторые из функций, которые позволяют выбрать наиболее вероятного кандидата в объекты, следующие:
− относится к решаемой проблеме;
− можно указать буквально или в переносном смысле;
− существует чёткая граница/отличим от других;
− имеет внутреннюю идентичность;
− имеет имя;
− имеет свойства, но не является свойством;
− имеет поведение, но сам не является поведением;
− может быть создан, уничтожен или им можно манипулировать.
Из объектов, которые мы находим в реальном мире или в устаревшей сис­теме, можно выбрать некоторые релевантные и сгруппировать их по общности, рассматривая функции, которые имеют отношение к нашему проекту или об­ласти. Назовём эти классы естественными группировками. Например, изучая библиотеку, мы можем сгруппировать объекты в книги, видео, библиотечные карточки, постоянные посетители и библиотекари. Это классы-кандидаты на­шей системы.
Некоторые авторы рекомендуют прочитать постановку задачи или требо­вания к проекту и подчеркнуть все существительные и словосочетания и начать с этого списка в качестве объектов-кандидатов или классов. Этот подход может сработать в случае работы над совершенно новым проектом без экспертов по системе или предметной области. Во многих реальных проектах с несколькими страницами в формулировке проблемы этот подход является громоздким, но выбор ключевых существительных в описании системы может быть первым шагом.
23
Класс – это существительное в единственном числе, а не массовое (или не­исчисляемое существительное). Если мы говорим: «дом сделан из кирпичей», то отдельные кирпичи являются объектами и могут быть названы или пересчи­таны, а класс, в который они попадают – «Кирпич». Название класса обычно выделяется жирным шрифтом, в единственном числе и начинается с заглавной буквы.
Класс и его объекты должны представлять объекты, имеющие чёткую гра­ницу и отличимые от других. В большинстве систем облака или капли воды не создают объектов, потому что они сливаются при контакте. Точно так же абст­ракции не могут являться классом.
Не все существенные единственные отличительные существительные мо­гут быть в первоначальном списке объектов и классов. Рассмотрим моменты во времени: полдень, зачатие, распад частиц. Они не объекты; они не постоянны, это события. Поэтому, если мы подчеркнём все существительные при работе над выбором классов, события будут отдельной идентифицируемой категорией. Это будет полезно позже на диаграммах поведения.
Иногда запись события необходима для отслеживания или манипуляции и имеет свои собственные свойства. Поэтому, несмотря на то, что это события или операции, мы конвертируем их в объекты, чтобы ими можно было манипу­лировать, хотя при этом сохраняем их также в модели как события и как опера­ции. Эта операция очень распространена, когда событие или действие создают постоянные отношения между двумя объектами. Например, покупка в супер­маркете, брак и человек, записывающийся в библиотеку (становящийся читате­лем) – события или операции, которые необходимо отслеживать с объектами Покупка, Брак и Членство.
Атрибуты – это интересующие нас с точки зрения проекта свойства клас­са. Поскольку элемент отображения класса является частью представления, можно опустить выделение атрибута на диаграмме, хотя связанные атрибуты присутствуют в модели. Можно опустить из блока атрибутов любой из атрибу­тов, потому что только некоторые атрибуты будут иметь отношение к текуще­му представлению. Если в итоге опускаются все атрибуты, возможно опустить весь блок атрибутов для этого класса на диаграмме.
24
Что следует запомнить
• Объект или экземпляр – это релевантная, поименованая сущ-
ность с чёткими границами и внутренней идентичностью.
• Объект отличается от других объектов.
• Объект может быть создан, уничтожен или изменён.
• Класс представляет собой существительное или именную
фразу, которая называет потенциальную группу объектов.
• Поиск класса по объектам – это процесс, называемый класси-
фикацией.
• Нахождение объекта из класса – это процесс, называемый
созданием экземпляра.
• Один из способов поиска объектов и классов – прочитать
формулировку проблемы или требования проекта и выбрать соответ-
ствующие существительные или словосочетания.
• В качестве потенциальных классов можно включить постоян-
ные записи или историю событий или поведения.
• Массовые существительные, роли, моменты времени и усло-
вия можно использовать для дальнейшего рассмотрения в качестве
атрибутов, действующих лиц, сообщений и событий и состояний.
Атрибут, как правило, также является существительным, но это свойство, и, как правило, атрибут не является независимой сущностью. Например, год издания – это не самостоятельное понятие, это свойство книги.
На рисунке 2.1 показаны четыре вида одного и того же класса Book. В первом представлении отображаются четыре атрибута (название, автор, год и номер по каталогу). Атрибуты обычно начинаются со строчной буквы. Каждый из этих атрибутов вводится как строка или как целое число. Тип следует за именем атрибута и обычно начинается с прописной буквы. Если указан тип, пе­ред именем типа для синтаксического анализа требуется «:».
25
Рис. 2.1. Четыре вида одного класса
Операции – это релевантное поведение, которое инициируют экземпляры класса выполнить, инициировать или использовать соответствующее поведе­ние. Если мы смотрим на постановку задачи, мы ищем глаголы. Для класса Book в библиотеке начинающие разработчики моделей часто выбирают такие операции, как read (), open (), V и turn page (). Это не совсем неправильно; это естественно, так как это действия людей с книгой в библиотеке. Тем не менее, мы можем выполнить эти действие с любой книгой и где угодно. Более того, они не меняют состояния книги или чего-либо ещё в контексте библиотеки.
Поскольку Книга не является активным классом, т.е. она ничего не делает сама по себе, необходимо посмотреть на действия людей или других активных классов с Книгой. Возможный список может включать checkout (), reserve () и accession (). Кроме того, всякий раз, когда есть операция, необходимо найти ва­рианты этой операции – противоположность или отрицание операции. Поэтому, помимо проверки, резервирования и вступления, необходимо включить опера­ции возврата, отмены резерва и исключения.
В объектно-ориентированной теории, поскольку методы () принадлежат классу и являются внутренними по отношению к классу, вызов операции над объектом является запросом, а не командой. Методы не отображаются на диа­грамме классов, хотя их можно подробно изучить на диаграмме поведения.
Под блоком атрибутом находится ещё один блок для операций. Операции обычно изображаются начиная с строчной буквы и заканчивая "()", в которых могут содержаться аргументы операции (называемые в UML параметрами). На рисунке 2.2 показано четыре разных представления класса Book с опера­циями. Во всех этих представлениях исключён раздел атрибутов.
26
Рис. 2.2. Класс Книга с операциями
Покажем четыре интересных операции.
На втором виде отображено название блока операций, сами операции и круглые скобки, чтобы указать, что некоторые операции отсутствуют.
В третьем представлении мы отображаем аргументы или параметры для операций. Когда Книга выдана, нам нужно указать дату выдачи и дату возврата. Когда книга возвращается, нам не нужно знать, кто её вернул, просто требуется дата возвращения.
В самом правом представлении Книги мы приводим типы аргументов. И bdate, и rdate имеют тип Date, а аргумент получившего книгу имеет тип Member (член библиотеки). Также показываем возвращаемые значения для этих операций. Когда книга выдана, нам возвращается срок возвращения типа Date. Если Книга была просрочена, когда мы вернём Книгу, рассчитывается стои­мость штрафа. Название типов начинаются с «:», и следуют за строкой опера­ции.
В UML, если мы хотим показать, что ничего не возвращено, мы не указы­ваем «: <Type>» после определения операции (например, нулевого типа). Хотя это и не является частью UML, поскольку это зависит от языка программирова­ния, часто можно добавить модификаторы типов, связанные с указателями, такие как «*» и «&», в зависимости от инструмента.
Иногда, если имеется много элементов с таким же именованным атрибу­том, становится трудно сослаться на правильный элемент. Пусть есть класс Video, который также имеет атрибут year. Если необходимо сослаться на атри­бут year в Book, следует указать «Book.year». Чтобы сослаться на атрибут year в классе Video, мы бы сказали «Video .year». Эта нотация "." аналогична той, ко­торая используется во многих языках программирования и является частью
27
языка объектных ограничений (OCL). Он является частью строки идентифика­ции пути, используемой в качестве оператора области именования.
Этот подход также используется для обозначения поведенческого члена класса. Если мы хотим сослаться на операцию borrow (), это может появиться как в классе Book, так и в Video и, в зависимости от класса будем называть эту операцию «Book.borrow ()» и «Video.borrow ()». Если бы мы хотели вызвать операцию заимствования для экземпляра myBook или для экземпляра myVideo, мы бы аналогичным образом использовали myBook.borrow () и myVideo.borrow ().
По умолчанию в UML все функции считаются областью действия экземп­ляра. При ссылке на атрибут можно получить значение, которое имеет экземп­ляр, т.е. myVideo.date возвращает значение, которое экземпляр myVideo хранит для даты. Чтобы выдать книгу, используется myBook.borrow (), и операция применяется к экземпляру myBook.
Также можно указать, что объект является объектом в рамках классифика­тора. Это означает, что значение определяется один раз для класса. Для стати­ческого атрибута это можно рассматривать как каждый экземпляр класса, все­гда разделяющий одно и то же значение. Альтернативно, у класса есть отдель­ное местоположение для себя, содержащее атрибут и значение. Статическая операция – это операция, которая применяется к классу в целом. Статические (класс-область) показываем, подчёркивая функцию.
На рисунке 2.3 это отображено как статический атрибут (numPatron), так и статическая операция (incrementnumPatron).
28
Рис. 2.3. Статические атрибуты и операции
Таким образом, значение numPatron будет общим количеством читателей в библиотеке.
Тип определяет набор значений, которые может иметь элемент. Этот набор может быть потенциально бесконечным по размеру, например, когда мы гово­рим о целых числах. В качестве альтернативы, он может быть ограничен по размеру, например, когда мы говорим о Boolean, который имеет только два зна­чения, True и False. В примерах были использованы типы данных Integer, String,
Date и Cost. Классы также являются типами, потому что наш класс Book (или Video) определяет набор возможных книг или видео. Каждый экземпляр Book
должен быть совместим с определёнными атрибутами и иметь слоты для значе­ний этих атрибутов.
Иногда возникает путаница относительно того, является ли что-то классом или типом данных. Они оба типа, но ведут себя по-разному. Основным отличи­ем является идентичность.
Представьте, что у вас две одинаковые книги со всеми одинаковыми атри­бутами. В этом случае мы говорим, что объекты/экземпляры классов имеют свою собственную идентичность. Два года авторского права с одинаковым зна­чением одинаковы, поскольку их значения одинаковы. Два товара с одинаковой стоимостью имеют одинаковую стоимость, но изменение одной из этих цен не меняет другую стоимость. Их идентичность была случайной, а не присущей.
Тип определяет набор значений, которые может иметь элемент. Классы также являются типами, потому что наш класс Book (или Video) определяет на­бор возможных книг или видео. Каждый экземпляр Book должен быть совмес­тим с определёнными атрибутами и иметь слоты для значений этих атрибутов.
Существует небольшое количество примитивных типов, определённых в UML, которые полезно знать. Они показаны на рис. 2.4. Некоторые инструмен­ты также предлагают дату и время в качестве примитивных типов.
29
Рис. 2.4. Примитивные типы UML
Эти типы UML не предназначены для соответствия какому-либо конкрет­ному типу языка программирования. Целое число – это не 4 байта, 2 байта или 8 байтов, оно имеет произвольную длину. Строка также произвольно длинна и не заканчивается нулём, а также не начинается с поля длины.
Конечно, любая физическая реализация типов должна соответствовать не­которой физической реальности. Инструменты моделирования предлагают па­кеты языков программирования, которые будут предоставлять дополнительные типы, соответствующие выбранному языку программирования. Например, если выбран C ++, будут предложены int, char, bool, float, каждый из которых зани­мает стандартное количество байтов в C ++. Если будет выбран другой языко­вой пакет, будет предложен другой выбор.
Если вы не выберете, но позже попытаетесь автоматически сгенерировать код из модели, большинство инструментов выберет наиболее близкое соответ­ствие на целевом языке. Возможно, лучше всего выполнять моделирование с использованием встроенных типов и использовать инструмент для выполнения перевода во время генерации кода, поскольку это наиболее переносимый под­ход. Одним из преимуществ моделирования с использованием UML является то, что можно ориентироваться на разные языки реализации без изменения модели.
Перечисления являются конечными значениями dataTypes. Каждое воз­можное значение типа Enumeration является одним из пользовательских лите­ралов, связанных с dataType. На рисунке 2.5 показаны некоторые примерные перечисления.
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]