Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 46
Текст из файла (страница 46)
Для всех операций-членов классов исвободных подпрограмм наши спецификации включают следующие основныепункты:Класс возвращаемого значения:Аргументы:ссылка на класссписок формальных аргументовЭти графы можно заполнить на выбранном языке реализации. Всоответствии с правилами языка можно включить еще один пункт:Квалификация:текстВ C++, например, этот пункт может содержать утверждение о том,является ли операция статической, виртуальной, чисто виртуальной иликонстантой.Использование дополнительных элементов обозначений требуетвведения дополнительной графы:Доступ:открытый | защищенный | закрытый | реализацияСодержание этой графы зависит от языка реализации. Например вObject Pascal все атрибуты и операции всегда открытые, в Ada операции могутбыть открытыми или закрытыми, а в C++ возможны любые из четырехуказанных случаев.Использование дополнительных элементов обозначений требует такжевведения графыПротокол:текстЭта графа происходит из практики языка Smalltalk: протокол операциине имеет семантического значения, а служит просто для именованиялогической совокупности операций, вроде таких, как initialize-release(инициализация-освобождение) или model access (доступ к модели).Следующие необязательные графы не имеют графических аналогов ислужат для формального описания семантики операции:Предусловия:ссылка наСемантика:ссылка наПостусловия:ссылка натекст | ссылка на текст программы |диаграмму объектовтекст | ссылка на текст программы |диаграмму объектовтекст | ссылка на текст программы |диаграмму объектовИсключения:список исключительных ситуацийПервые три пункта могут быть заполнены в любой из перечисленныхформ.
Последний содержит список исключительных ситуаций, содержащийимена соответствующих классов.Последняя серия необязательных граф служит для описаниянекоторых функциональных аспектов операции:Параллельность:синхронныйПамять:Время:последовательный |охраняемый |выражениевыражениеПервые две аналогичны одноименным графам в спецификации класса.Третья - относительные или абсолютные оценки времени выполненияоперации.5.3. Диаграммы состояний и переходовСущественное: состояния и переходыДиаграмма состоянии и переходов показывает: пространствосостояний данного класса; события, которые влекут переход из одногосостояния в другое; действия, которые происходят при изменении состояния.Мы приспособили обозначения, использованные Харелом [11]: его работапредоставляет простой, но очень выразительный подход, который гораздоэффективнее традиционных автоматов с конечным числом состоянии.10Отдельная диаграмма состояний и переходов представляет определенныйракурс динамической модели отдельного класса или целой систе-Рис.
5-18. Значок состояниямы. Мы строим диаграммы состояний и переходов только для классов,поведение которых (управляемое событиями) для нас существенно. Мыможем также представить диаграмму состояний и переходов дляуправляемого событиями поведения системы в целом. Эти диаграммыиспользуются в ходе анализа, чтобы показать динамику поведения системы, ав ходе проектирования - для выражения поведения отдельных классов или ихвзаимодействия.Два основных элемента диаграммы состояний и переходов - это,естественно, состояния и переходы между ними.Состояния. Состояние представляет собой итоговый результатповедения системы.
Например, только что включенный в сеть телефоннаходится в начальном состоянии: его предыдущее поведение несущественно,при этом он готов к тому, чтобы позвонить или принять звонок. Если ктонибудь поднимет трубку, телефон перейдет в состояние готовности к наборуномера; в этом состоянии мы не ожидаем, что телефон зазвонит, ноприготовились к беседе с одним или несколькими абонентами. Если кто-либо10Мы дополнили его работу применительно к объектно-ориентированномупрограммированию, следуя предложениям Румбаха [12] и Беара и др. [13].наберет ваш номер, а телефон находится в начальном состоянии (трубкаположена), то когда вы поднимете трубку, телефон перейдет в состояние сустановленным соединением, и вы сможете поговорить со звонившим.В любой момент времени состояние объекта определяет набор свойств(обычно статический) объекта и текущие (обычно динамические) значенияэтих свойств.
Под "свойствами" подразумевается совокупность всех связей иатрибутов объекта. Мы можем обобщить понятие состояния так, чтобы онобыло применимо и к объекту, и к классу, так как все объекты одного класса"живут" в одном пространстве состояний. Это пространство можетпредставлять собой неопределенное, хотя конечное множество возможных (ноне всегда ожидаемых или желаемых) состояний. На рис. 5-18 показанообозначение, которое мы используем для отдельного состояния.Каждое состояние должно иметь имя; если оно оказывается слишкомдлинным, то его можно сократить или увеличить значок состояния. Каждоеимя состояния должно быть уникально в своем классе.
Состояния,ассоциированные со всей системой, глобальны, то есть видимы отовсюду, аобласть видимости вложенных состояний (дополнительное понятие) ограничена соответствующей подсистемой. Все одноименные значкисостояний на одной диаграмме обозначают одно и то же состояние.На значках некоторых состояний полезно указать ассоциированные сними действия. Как показано на рис.
5-18, действия обозначаются так же, какатрибуты и операции в значке класса. Мы можем увеличить значок, чтобыувидеть весь список действий, или, если нет необходимости указыватьдействия, можно удалить разделяющую линию и оставить только имя.11Ассоциацию действий с состояниями мы обсудим позднее.Рис. 5-19. Значок перехода из состояния в состояниеПереходы.
Событием мы называем любое происшествие, котороеможет быть причиной изменения состояния системы. Изменение состоянийназывается переходом. На диаграмме переходов и состояний он изображаетсязначком, показанным на рис. 5-19. Каждый переход соединяет два состояния.Состояние может иметь переход само в себя; обычно есть несколькоразличных переходов в одно и тоже состояние, но все переходы должны бытьуникальны в том смысле, что ни при каких обстоятельствах не можетпроизойти одновременно два перехода из одного состояния.Например, в поведении гидропонной теплицы играют роль следующиесобытия:•Посажена новая партия семян•Урожай созрел и готов к сбору•Из-за плохой погоды упала температура в теплице•Отказало охлаждающее устройство•Наступил заданный момент времени.Как будет рассказано в следующей главе, идентификация событий,подобных этим, позволяет определить границы поведения системы ираспределить обязанности по осуществлению этого поведения междуотдельными классами.Каждое из первых четырех перечисленных выше событий, вероятно,вызывает некоторое действие - например, начало или остановку выполнениянекоторого плана сельскохозяйственных работ по посеву, включение11Для совместимости с обозначениями Харела разделяющую линию можно вообщеубрать.нагревателя или посылку сигнала тревоги технику, обслуживающему систему.Отсчет времени - это другое дело: хотя секунды и минуты не имеют значения(посевы растут, очевидно, не так быстро), наступление нового часа или сутокможет вызвать некоторый сигнал, например, включить/выключить лампочки иизменить температуру в теплице, чтобы имитировать смену дня и ночи,необходимую для роста растений.Действием мы называем операцию, которая, с практической точкизрения, требует нулевого времени на выполнение.
Например, включениесигнала тревоги - действие. Обычно действие означает вызов метода,порождение другого события, запуск или остановку процесса. Деятельностьюмы называем операцию, требующую некоторого времени на свое выполнение.Например, нагрев воздуха в теплице - деятельность, запускаемая включениемнагревателя, который может оставаться включенным неопределенное время,до тех пор, пока не будет выключен явной командой.Модель событий, передающих сообщения, которую предложил Харел,концептуально безупречна, но ее нужно приспособить к объектному подходу.При анализе мы можем давать предварительные названия событиям идействиям, в общих чертах отражая наше понимание предметной области.Однако, отображая эти понятия на классы, мы должны предложитьконкретную стратегию реализации.Событие может быть представлено символическим именем (илиименованным объектом), классом или именем некоторой операции.
Например,событие CoolerFailure (неисправность охлаждающего устройства) можетобозначать либо литерал, либо имя объекта. Мы можем придерживаться тойстратегии, что все события являются символическими именами и каждыйкласс с поведением, управляемым событиями, имеет операцию, котораяраспознает эти имена и выполняет соответствующие действия. Такаястратегия часто используется в архитектурах типа моделъ-представлениекотроллер (model-view-controller), которая пришла из языка Smalltalk. Длябольшей общности можно считать события объектами и определить иерархиюклассов, которые представляют собой абстракции этих событий. Например,можно определить общий класс событий DeviceFailure (неисправностьустройства) и его специализированные подклассы, такие как CoolerFailure(неисправность охлаждающего устройства) и HeaterFailure (неисправностьнагревателя).
Теперь извещение о событии можно связать с экземпляромкласса-листа (например, CoolerFailure) или более общего суперкласса(DeviceFailure). И если выполнение некоторого действия назначено толькопри возникновении события класса CoolerFailure, то это означает, что вседругие случаи отказа устройств должны намеренно игнорироваться. С другойстороны, если выполнение действия связано с событием DeviceFailure, тодействие должно выполняться независимо от того, на каком устройствепроизошел сбой. Продолжая в том же духе, мы можем сделать так, чтобыпереходы из состояния в состояние были полиморфны относительно классовсобытий.