UML2 и унифицированный процесс. Джим арлоуайла нейштадтпрактический объектно ориентированныйанализ и проектированиеu
![]()
|
148 Глава 7. Объекты и классы 7.7.2. Деструкторы – пример класса ClubMember 7.2. Что такое объекты? 7.2.1. Инкапсуляция 7.2.2. Обмен сообщениями 7.3. Нотация объектов в UML 7.3.1. Значения атрибутов объектов 7.4. Что такое классы? 7.4.1. Классы и объекты 7.4.2. Создание экземпляров класса изучаем классы изучаем объекты изучаем синтаксис UMLобъекта изучаем создание и уничтожение объектов изучаем синтаксис UMLкласса изучаем процесс присваивания имен классам изучаем атрибуты изучаем операции изучаем стереотипы изучаем область действия изучаем конструкторы и деструкторы 7.5. Нотация классов в UML 7.8. Что мы узнали 7.5.2. Ячейка атрибутов 7.5.2.3. Кратность 7.5.2.4. Начальное значение 7.5.2.5. Расширенный синтаксис атрибута 7.5.3. Ячейка операций 7.5.3.1 Направление параметра 7.5.3.2. Значения параметров по умолчанию 7.5.3.3. Расширенный синтаксис операции 7.5.3.4. Операции запроса 7.5.4. Синтаксис стереотипа класса 7.6. Область действия 7.6.1. Область действия класс и область действия экземпляр 7.6.2. Область действия опре деляет возможность доступа 7.7. Создание и уничтожение объектов 7.7.1. Конструкторы – пример класса ClubMember else else else 7.5.2.1. Видимость 7.5.2.2. Тип 7.5.1. Ячейка имени Рис . 7.1 . Пл ан г л ав ы 7.2. Что такое объекты? 149 крытие данных объекта за уровнем операций всегда считается хоро шим ОО стилем. Объекты скрывают данные на уровне функций, которые называются операциями. Каждый объект является экземпляром некоторого класса, определяю щего общий набор свойств (атрибутов и операций), присущих всем эк земплярам этого класса. Идея классов и классификаторов на самом де ле очень проста. Представим принтер типа «Epson Photo 1200». Он описывает свойства всех отдельных экземпляров данного класса, в том числе и конкретный «Epson Photo 1200 с/н 34120098», стоящий на на шем столе. Конкретный экземпляр класса называется объектом. Немного поразмыслив над этим примером объекта принтера Epson, можно увидеть, что ему присущи определенные свойства, общие для всех объектов. Каждый объект имеет уникальный идентификатор. • Идентификатор (identity) – это определение существования и един ственности объекта во времени и пространстве. Это то, что отличает его от всех остальных объектов. В нашем примере серийный номер может использоваться в качестве идентификатора для обозначения конкретного принтера на нашем столе и представления уникально го идентификатора этого объекта. Серийный номер – замечатель ный способ идентифицировать физический объект. Для идентифи кации каждого программного объекта, принимающего участие в ОО анализе и проектировании, используется аналогичный принцип – идея объектной ссылки. Конечно, в реальности не у всех объектов есть серийный номер, но все равно они имеют уникальные иденти фикаторы: конкретные пространственные и временные координа ты. Подобным образом в ОО программных системах каждый объект имеет некоторую объектную ссылку. Значения атрибутов хранят данные объекта. • Состояние (state) – определяется значениями атрибутов объекта и его отношениями с другими объектами в конкретный момент вре мени. В табл. 7.1. приведен полный список возможных состояний принтера, из которого видно, как состояние объекта зависит от зна чений его атрибутов и его связи с другими объектами. • Поведение (behavior) – принтер может выполнять конкретные дей ствия: switchOn() (включиться) switchOff() (выключиться) 150 Глава 7. Объекты и классы printDocument() (распечатать документ) pageFeed() (заправить бумагу) clearInkJetNozzles() (очистить форсунки) changeInkCartridge() (заменить картридж) Вызов операции объекта всегда приводит к изменению значений одного или более его атрибутов или отношений с другими объектами. Это мо жет обусловить переход состояний – целенаправленный переход объ екта из одного состояния в другое. Из табл. 7.1 видно, что состояние объекта может влиять и на его поведение. Например, если в принтере закончились чернила (состояние объекта = OutOfBlackInk), вызов опера ции printDocument() приведет к сообщению об ошибке. Поэтому поведе ние printDocument() является зависимым от состояния. Метод – это реализация операции. Операция – это описание части поведения. Реализация этого поведе ния называется методом (method). Таблица 7.1 7.2.1. Инкапсуляция Как уже говорилось, идентификатор объекта – это некий уникальный дескриптор, обычно адрес памяти, предоставляемый языком реализа ции. С этого момента будем называть эти дескрипторы объектными ссылками. В ОО анализе не надо беспокоиться об их реализации. Мож но просто принять, что у каждого объекта есть уникальный идентифи катор, управляемый технологией реализации. Возможно, при проек тировании понадобится рассмотреть реализацию объектных ссылок. Это необходимо, если целевым языком является ОО язык программи рования, такой как С++, который позволяет напрямую работать с оп ределенными типами объектных ссылок, известными как указатели. На рис. 7.2 приведено концептуальное представление объекта, под черкивающее инкапсуляцию. Обратите внимание, что рис. 7.2 не яв Состояние объекта Атрибут класса Значение атри бута объекта Отношение On power on Не определено Off power off Не определено OutOfBlackInk blackInkCartridge empty Не определено OutOfColorInk colorInkCartridge empty Не определено Connected не определено не определено Подключен к объек ту компьютер NotConnected не определено не определено Не подключен к объ екту компьютер 7.2. Что такое объекты? 151 ляется UML диаграммой. UML синтаксис для объектов будет показан позже. Состояние объекта определяется значениями его атрибутов. Состояние объекта – это набор значений атрибутов (в данном случае 1234567801, «Jim Arlow», 300.00) объекта в любой момент времени. Значения некоторых атрибутов постоянны, значения других могут со временем меняться. Например, номер счета и имя останутся постоян ными, а вот баланс, надеемся, будет постепенно увеличиваться! Поскольку баланс меняется со временем, мы видим, что состояние объекта также изменяется во времени. Например, если баланс отрица тельный, можно сказать, что объект находится в состоянии Overdrawn (кредит превышен). При изменении баланса из отрицательного в нуле вой объект существенно меняет свою суть: переходит из состояния Overdrawn в состояние Empty (пустой). Более того, когда баланс объекта Account (счет) становится положительным, осуществляется еще один пе реход состояния: из Empty в InCredit (кредитоспособен). Возможны и дру гие переходы состояний. Фактически любой вызов операции, приво дящий к изменению сути объекта, обуславливает переход состояний. UML предоставляет мощный набор методов моделирования измене ний состояния, которые называются конечными автоматами; им по священа глава 21. Поведение объекта – это то, «что он может сделать для нас», т. е. его операции. значения атрибутов операции объект Account deposit( ) withdraw( ) getOwner( ) setOwner( ) 1234567801 «Jim Arlow» 300.00 Рис. 7.2. Представление объекта, подчеркивающее инкапсуляцию 152 Глава 7. Объекты и классы Поведение любого объекта – это, по существу, то, «что он может сде лать» для вас. Объект на рис. 7.2 предоставляет операции, перечис ленные в табл. 7.2. Таблица 7.2 Этот набор операций определяет поведение объекта. Обратите внима ние, что вызов некоторых из этих операций ( deposit(), withdraw(), setOwn er()) приводит к изменению значений атрибута и может генерировать переходы состояния. Операция getOwner() не меняет значения атрибута и поэтому не приводит к переходу состояния. Инкапсуляция, или сокрытие данных, – одно из основных преиму ществ ОО программирования. Она обеспечивает возможность создания более надежного и расширяемого программного обеспечения. В этом простом примере объекта Account пользователю не надо беспокоиться о структуре данных, сокрытых в объекте. Его интересует только то, что объект может сделать. Иначе говоря, ему интересны сервисы (ser vices ), предлагаемые другим объектам. 7.2.2. Обмен сообщениями Объекты формируют поведение системы путем обмена сообщениями по связям. Это – кооперация. У объектов есть значения атрибутов и поведение, но как эти объекты объединить, чтобы создать систему программного обеспечения? Объ екты кооперируются для осуществления функций системы. Это озна чает, что они устанавливают связи с другими объектами и обменива ются сообщениями по этим связям. Когда объект получает сообщение, он проверяет набор своих операций в поиске той, сигнатура которой соответствует сигнатуре сообщения. Если таковая имеется, он иници ирует эту операцию (рис. 7.3). В сигнатуру входят имя сообщения (или операции), типы параметров и возвращаемое значение. Во время выполнения ОО система состоит из множества создаваемых объектов, существующих некоторое время и затем, возможно, уничто жаемых. Эти объекты обмениваются сообщениями, инициируя серви сы друг друга. Такая структура радикально отличается от процедур Операция Семантика deposit() Размещает некоторую сумму в объекте Account. Увеличивает значение атрибута balance. withdraw() Снимает некоторую сумму с Account. Уменьшает значение атрибута balance. getOwner() Возвращает владельца объекта Account – операция запроса. setOwner() Меняет владельца объекта Account. 7.3. Нотация объектов в UML 153 ных программных систем, которые изменяются со временем путем по следовательного применения функций к данным. 7.3. Нотация объектов в UML Пиктограмма объекта в UML – это прямоугольник с двумя ячейками (рис. 7.4). В верхней ячейке размещается идентификатор объекта, ко торый всегда подчеркивается. Это важно, поскольку в UML обозначе ния классов и объектов очень похожи. Если строго следовать прави лам применения подчеркивания, никогда не возникнет вопроса, чем является моделируемый элемент – классом или объектом. UML очень гибок относительно представления объектов на диаграм мах объектов. Идентификатор объекта может включать следующие элементы. • Только имя класса, например :Account. Это означает, что имеется ано нимный объект или экземпляр данного класса (т. е. это экземпляр класса Account, но он не идентифицирован или в действительности не имеет значения, какой именно это экземпляр). Анонимные объекты обычно используются, когда на данной диаграмме присутствует тол ко один объект этого конкретного класса. Если необходимо показать два объекта одного и того же класса, каждому из них должно быть присвоено уникальное имя, чтобы можно было их различать. Объект Bank Объект Account сообщение Объект Bank посылает сообщение «withdraw 150.00» объекту Account В ответ объект Account вызывает свою операцию withdraw, которая уменьшает баланс счета на 150.00 withdraw (150.00) Рис. 7.3. Обмен сообщениями accountNumber : String = "1234567" owner : String = "Jim Arlow" balance : double = 300.00 имя атрибута ячейка атрибутов ячейка имени тип атрибута значение атрибута имя объекта имя класса jimsAccount:Account Рис. 7.4. Нотация объектов в UML 154 Глава 7. Объекты и классы • Только имя объекта, например jimsAccount. Здесь обозначен кон кретный объект, но не указано, какому классу он принадлежит. Данное обозначение может быть полезным на самых ранних стади ях анализа, когда еще не выявлены все классы. • Если указываются и имя объекта, и имя класса, они разделяются двоеточием. Двоеточие может читаться как «является экземпля ром класса». Таким образом, диаграмму на рис. 7.4 можно прочи тать так: существует объект с именем jimsAccount, который является экземпляром класса Account. Объекты одного класса имеют одинаковые операции и атрибуты, но зна чения их атрибутов могут быть разными. Имена объектов обычно записываются заглавными и строчными бук вами вперемежку, начиная со строчной буквы. Следует избегать спе циальных символов, таких как пробелы и подчеркивания. Такой стиль записи называют lowerCamelCase, потому что в результате полу чаются «горбатые» на вид слова. Как сказано в разделе 7.2, класс определяет атрибуты и операции на бора объектов. Поскольку все объекты одного класса имеют совершен но одинаковый набор операций, они перечисляются в пиктограмме класса, а не в пиктограмме объекта. Атрибуты по выбору могут быть приведены в нижней ячейке пикто граммы объекта. Тем атрибутам, которые решено вынести на диаграм му, должны быть присвоены имена. Их тип и значение указывать не обязательно. Имена атрибутов также записываются в стиле lowerCa melCase. 7.3.1. Значения атрибутов объектов Значение каждого атрибута записывается следующим образом: имя : тип = значение Можно отображать все, некоторые или вообще не отображать значе ния атрибутов. Все зависит от назначения диаграммы. Чтобы сохранить простоту и ясность диаграммы, можно опускать ти пы атрибутов, поскольку они уже определены в классе объекта. Когда будет показано применение диаграмм объектов при анализе (глава 12), станет понятно, почему может быть принято решение отображать в пиктограмме объекта не всю информацию. 7.4. Что такое классы? Книга «UML Reference Manual» [Rumbaugh 1] определяет класс как «де скриптор набора объектов, имеющих одинаковые атрибуты, операции, 7.4. Что такое классы? 155 методы, отношения и поведение». Подытожить это можно так: класс – это дескриптор набора объектов, имеющих одинаковые свойства. Класс описывает свойства ряда объектов. Каждый объект – это экземпляр только одного класса. Вот несколько рекомендаций относительно классов. • Класс надо рассматривать как шаблон объектов: класс определяет структуру (набор свойств) всех объектов этого класса. Все объекты одного класса должны иметь одинаковый набор операций, одинако вый набор атрибутов и одинаковый набор отношений, но значения атрибутов могут быть различными. • Класс – это штамп, а объекты – отпечатки этого штампа на листке бумаги. Или класс – это форма для печенья, а объекты – печенье. Каждый объект – это экземпляр только одного класса. Классификатор и экземпляр – принятые деления UML (см. главу 1), и самым обычным примером этого деления являются класс и объект. Класс – это спецификация или шаблон, которому должны следовать все объекты этого класса (экземпляры). Атрибуты, описанные классом, в каждом объекте имеют конкретные значения. Каждый объект будет отвечать на сообщения, инициируя операции, описанные классом. В зависимости от их состояния разные объекты могут отвечать на одно и то же сообщение по разному. Например, попытка снять $100 с бан ковского счета, на котором уже превышен кредит, приведет к резуль тату, отличному от того, если попытаться снять $100 со счета, на кото ром есть несколько сотен долларов кредита. Классификация – это, наверное, единственный имеющийся у людей способ упорядочить информацию о мире. По существу, это также одна из самых важных ОО концепций. Применяя понятие классов, можно говорить об отдельном типе машин или о виде дерева, даже не упоми ная конкретный экземпляр. То же самое в программном обеспечении. Классы позволяют описывать набор свойств, которыми должен обла дать каждый объект класса, без необходимости описывать каждый из этих объектов. Посмотрим на рис. 7.5 и подумаем, сколько классов изображено на этом рисунке? На самом деле ответа на этот вопрос нет! Существует практически не исчислимое количество способов классификации объектов реального мира. Вот несколько классов, которые можно увидеть: • класс кошек; • класс жирных прожорливых котов (у нас есть кот – экземпляр это го класса!); 156 Глава 7. Объекты и классы • класс деревьев; • класс листьев; • и т. д., и т. п. Правильный выбор схемы классификации – один из ключей к успешно му ОО анализу. Поскольку существует такое огромное количество вариантов, выбор наиболее подходящей схемы классификации – один из самых важных аспектов ОО анализа и проектирования. Как это делать, будет показа но в главе 8. Посмотрев на рис. 7.5 внимательнее, можно увидеть другие типы от ношений кроме уже упоминавшегося класс/экземпляр. Например, можно обнаружить несколько уровней классификации. Есть класс ко шек. Классификацию можно расширить и выделить подклассы «до машних кошек» и «диких кошек». Или даже подклассы «современ ные кошки» и «доисторические кошки». Это отношение между клас сами: один класс является подклассом другого. И наоборот, класс «кошки» является суперклассом «домашних кошек» и «диких ко шек». Более подробно об этом рассказывается в главе 10, посвященной наследованию. На рис. 7.5 видно, что у объектов «деревья» есть наборы объектов «ли стья». Это очень прочный вид отношений между деревьями и листьями. Каждый объект «лист» принадлежит определенному объекту «дерево». Деревья не могут обмениваться или совместно использовать листья. И жизненный цикл листа тесно связан и контролируется деревом. Та кое отношение между объектами в UML называют композицией (com position). Рис. 7.5. Сколько классов здесь изображено? 7.4. Что такое классы? 157 Однако отношения между, скажем, компьютерами и внешними устрой ствами совершенно другие. Компьютеры могут обмениваться внешни ми устройствами, например такими, как пара динамиков. Разные ком пьютеры даже могут совместно использовать некоторые устройства. Кроме того, если компьютер выходит из строя, его внешние устройства могут прекрасно пережить его и использоваться новой машиной. Жиз ненный цикл внешних устройств обычно не зависит от жизненного цикла компьютера. В UML этот тип отношений объектов называется аг регацией (aggregation). Отношения объектов, в частности композиция и агрегация, более подробно рассматриваются в главе 18. |