Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 45
Текст из файла (страница 45)
В ассоциации между классамиEnvironmentalController и Light требуется, чтобы отдельные источникисвета были уникально индексированы относительно друг друга в контекстеданной ассоциации. Имеется еще ограничение, наложенное на ассоциацииEnvironmentalController с классами Heater и Cooler, состоящее в том,что диспетчер не может включить нагреватель и охладитель одновременно.Это ограничение прикладывается к ассоциации, а не к классам Heater иCooler, потому что его соблюдение не может быть поручено самимнагревателям и охладителям.При необходимости можно включить в выражение ограничения именадругих ассоциаций с помощью квалифицированных имен, использованных впроекте. Например, Cooler:: запускает однозначно именует одну изассоциаций класса-диспетчера.
В нашей системе обозначений такиевыражения часто используются в ситуации, когда один класс имеетассоциацию (например, агрегацию) с двумя (или более) другими классами, нов любой момент времени каждый его экземпляр может быть ассоциировантолько с одним из объектов.Ограничения бывают также полезны для выражения вторичныхклассов, атрибутов и ассоциаций.8 Например, рассмотрим классы Adult(взрослые) и Child (дети), являющиеся подклассами абстрактного классаPerson (Люди). Мы можем снабдить класс Person атрибутом dateofbirth(дата рождения) и добавить атрибут, называемый age (возраст), например,потому что возраст играет особую роль в нашей модели реального мира.8В терминологии Румбаха это называется производные сущности: для них ониспользует специальный значок.
Нашего общего подхода к ограничениям достаточно,чтобы выразить семантику производных классов, атрибутов и ассоциации; этотподход облегчает повторное использование существующих значков и однозначноеопределение сущностей, от которых взяты производные.Однако, age - атрибут вторичный: он может быть определен черезdateofbirth. Таким образом, в нашей модели мы можем иметь оба атрибута,но должны указать ограничение, определяющее вывод одного из другого.Вопрос о том, какие атрибуты из каких выводятся, относится к тактике, ноограничение пригодится независимо от принятого нами решения.Аналогично, мы могли бы иметь ассоциацию между классами Adultи Child, которая называлась бы Parent (родитель), а могли бы включить иассоциацию, именуемую Caretaker (попечитель), если это нужно в модели(например, если моделируются официальные отношения родительства всистеме социального обеспечения). Ассоциация Caretaker вторична: ееможно получить как следствие ассоциации Parent; мы можем указать этотинвариант как ограничение, наложенное на ассоциацию Caretaker.Ассоциации с атрибутами и примечания.
Последнеедополнительное понятие связано с задачей моделирования свойствассоциаций; в системе обозначений задача решается введением элемента,который может быть приложен к любой диаграмме.Рассмотрим пример на рис. 5-17. На нем показана ассоциация многиеко-мно-гим между классами Crop и Nutrient. Эта ассоциация означает, что ккаждому посеву применяется N (любое число) удобрений, а каждое удобрениеприменяется к N (любому числу) посевов.
Класс NutrientSchedule являетсякак бы свойством этого отношения многие-ко-многим: каждый его экземплярсоответствует паре из посева и удобрения. Чтобы выразить этотсемантический факт, мы рисуем на диаграмме пунктирную линию отассоциации Crop/Nutrient (ассоциация с атрибутом) к ее свойству - классуNutrientSchedule (атрибут ассоциации). Каждая уникальная ассоциацияможет иметь не больше одного такого атрибута и ее имя должносоответствовать имени класса-атрибута.Идея атрибутирования ассоциаций имеет обобщение: при анализе ипроектировании появляется множество временных предположений и решений;их смысл и назначение часто теряются, потому что нет подходящего места дляих хранения, а хранить все в голове - дело немыслимое. Поэтому полезноввести обозначение,Рис.
5-17. Ассоциация с атрибутом и примечаниепозволяющее добавлять произвольные текстовые примечания к любомуэлементу диаграммы. На рис. 5-17 имеется два таких примечания. Одно изних, приложенное к классу NutrientSchedule, сообщает нечто обожидаемой уникальности его экземпляров (Выбирает из общего наборарасписаний); другое (Получаем из базы данных удобрений) приложено кконкретной операции класса Nutrient и выражает наши пожелания к еереализации.Для таких примечаний мы используем значки, похожие на бумажки, исоединяем их с элементом, к которому они относятся, пунктирной линией.Примечания могут содержать любую информацию: обычный текст,фрагменты программ или ссылки на другую документацию (все это можетпригодиться при разработке инструментов проектирования).
Примечаниямогут быть не связаны ни с каким элементом, это значит, что они относятся ксамой диаграмме.9СпецификацииСпецификация - это неграфическая форма, используемая для полногоописания элемента системы обозначений: класса, ассоциации, отдельнойоперации или целой диаграммы. Просматривая диаграммы, можноотносительно легко разобраться в большой системе; однако одногографического представления недостаточно: мы должны иметь некоторыепояснения к рисункам, и эту роль будут играть спецификации.Как было сказано ранее, диаграмма - срез разрабатываемой моделисистемы. Спецификации же служат неграфическими обоснованиями каждогоэлемента обозначений. Таким образом, множество всех синтаксических исемантических фактов, нашедших свое отражение на диаграмме, должно бытьподмножеством фактов, описанных в спецификации модели исогласовываться с ними.
Очевидно, что важную роль в сохранениисогласованности диаграмм и спецификаций может играть инструментпроектирования, поддерживающий такую систему обозначений.В этом разделе мы рассмотрим сначала основные элементы двухважнейших спецификаций, а затем изучим их дополнительные свойства. Мыне ставим себе задачу подробного описания каждой спецификации, - онозависит от пользовательского интерфейса конкретных сред, поддерживающихнашу систему обозначений.
Мы также не будем представлять спецификациивсех элементов (в частности, вне нашего внимания окажутся метакласс иотдельные типы связей). В большинстве такие спецификации или являютсяподмножеством более общих спецификаций, таких как спецификации классов,или ничего не добавляют к графическому представлению. Особенно важноподчеркнуть следующее: спецификация должна отражать то, что не выраженов графических элементах диаграммы; спецификации содержат туинформацию, которую лучше записать в текстовом, а не графическом виде.Общие элементы.
Все спецификации имеют как минимум следующиекомпоненты:Имя:Определение:идентификатортекстУникальность имени зависит от именуемого элемента. Например,имена классов должны быть уникальны по крайней мере в содержащей ихкатегории, тогда как имена операций имеют область видимости, локальнуюдля содержащего их класса.Определение - это текст, идентифицирующий представленноеэлементом понятие или функцию и пригодный для включения в словарьпроекта (который обсуждается в следующей главе).В каждой спецификации содержатся минимальные сведения. Конечно,используемый инструмент автоматического проектирования может вводитьсвои собственные графы для нужд конкретной программной среды.
Однако,важно указать, что независимо от того, сколько граф включает в себяспецификация, не следует навязывать разработчику дурацкие правила, покоторым он обязан заполнить все части спецификации, прежде чем приступит9Значок, который мы используем, похож на обозначение примечаний во многихwindows-системах, особенно следующих традициям Macintosh.
Непосредственнымивдохновителями нашего обозначения были предложения Гамма, Хелпа, Джонсона иВлисси-Деса[10].к следующему этапу разработки. Обозначения должны облегчать разработку,а не создавать дополнительные трудности.Спецификации класса. Каждый класс в модели имеет ровно однуспецификацию, в которой содержатся как минимум следующие пункты:Обязанности:Атрибуты:Операции:Ограничения:текстсписок атрибутовсписок операцийсписок ограниченийКак говорилось в предыдущей главе, обязанности класса - это списокпредоставляемых им гарантий поведения.
В следующей главе будет показано,как мы используем эту графу для регистрации обязанностей классов, которыемы открываем или изобретаем в процессе разработки.Остальные пункты - атрибуты, операции, ограничения - соответствуютих графическим аналогам. Некоторые операции могут быть настольковажными, что следует снабдить их собственными спецификациями, которыемы обсудим ниже.Перечисленные основные понятия могут быть представлены втерминах выбранного языка реализации. В частности, все эти сведения, какправило, однозначно фиксируются объявлением класса на C++ илиспецификацией пакета в Ada.Как говорилось в главе 3, часто поведение некоторых важных классовнаилучшим образом выражается на языке конечного автомата, поэтому мывключим в спецификацию класса дополнительную графу:Автомат:ссылка на автоматИспользование дополнительных элементов системы обозначенийтребует ввести в спецификацию класса следующие пункты:Управление экспортом:Мощность:открытый | реализациявыражениеСмысл этих пунктов вполне тождественен их графическим аналогам.Параметризованные и инстанцированные классы должны включатьследующий пункт:Параметры:список формальных или фактическихпараметровСледующие необязательные пункты не имеют графических аналогов;они служат, чтобы указать некоторые функциональные аспекты класса:Устойчивость:Параллельность:Место в памяти:мгновенный | постоянныйпоследовательный | охраняемый |синхронный | активныйвыражениеПервое из этих свойств отражает продолжительность жизни объектовкласса:постоянная сущность - это та, чье состояние может пережить самобъект, в отличие от мгновенных, состояние которых пропадает с истечениемвремени жизни объекта.Второе свойство показывает в какой степени класс может работать вмногопоточной системе (см.
главу 2). По умолчанию объекты последовательные, то есть рассчитаны на один поток. Охраняемый исинхронный классы "выдерживают" несколько потоков. При этом охраняемыйкласс ожидает, что клиентские потоки как-то договариваются о взаимномисключении, с тем чтобы в каждый момент времени с ним работал толькоодин из них. Синхронный класс сам обеспечивает взаимное исключениеклиентов. Наконец, активный класс имеет свой поток.Последний пункт содержит сведения об абсолютном илиотносительном потреблении памяти объектами этого класса. Мы можемиспользовать эту графу для подсчета размера класса или его экземпляров.Спецификации операций.