Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 39
Текст из файла (страница 39)
При идентификации одного толькообъекта вам нужно придумать имена: для него, для его класса и для модуля, вкотором класс объявлен. Умножьте на тысячу объектов и сотни классов, и выпоймете, как остра проблема.Мы предлагаем следующие правила:•Объекты следует называть существительными: theSensor или shape.•Классы следует называть обобщенными существительными: Sensors,Shapes.•Операции-модификаторы следует называть активными глаголами: Draw,moveLeft.•У операций-селекторов в имя должен включаться запрос или формаглагола "to be": extentOf, isOpen.•Подчеркивание и использование заглавных букв - на ваше усмотрение,постарайтесь лишь не противоречить сами себе.Идентификация механизмовКак найти механизмы? В предыдущем обсуждении мы называлимеханизмами структуры, посредством которых объекты взаимодействуютдруг с другом и ведут себя так, как требуется.
Так же как при разработкекласса фактически определяется поведение отдельных объектов, так же имеханизмы служат для задания поведения совокупности объектов. Такимобразом, механизмы представляют шаблоны поведения.Рассмотрим требование, предъявляемое к автомобилю: нажатие наакселератор должно приводить к увеличению оборотов двигателя, аотпускание акселератора - к их уменьшению. Как это происходит, водителюсовершенно безразлично. Может быть использован любой механизм,обеспечивающий нужное поведение, и его выбор - дело вкуса разработчика.Например, допустимо любое из предложенных ниже инженерных решений:•Механическая связь между акселератором и карбюратором (обычноерешение).•Под педалью ставится датчик давления, который соединяется скомпьютером, управляющим карбюратором (механизм управления попроводам).•Карбюратора нет.
Бак с горючим находится на крыше автомобиля итопливо свободно течет в двигатель. Поток топлива регулируетсязажимом на трубке. Нажатие на педаль акселератора ослабляет зажим(очень дешево).Какую именно реализацию выберет разработчик, зависит от такихпараметров, как стоимость, надежность, технологичность и т. д.Подобно тому, как было бы недопустимой невежливостью со стороныклиента нарушать правила пользования сервером, также и выход за пределыправил и ограничений поведения, заданных механизмом, социальнонеприемлем. Водитель был бы удивлен, если бы, нажав на педальакселератора, он увидел зажегшиеся фары.Ключевые абстракции определяют словарь проблемной области,механизмы определяют суть проекта. В процессе проектирования разработчикдолжен придумать не только начинку классов, но и то, как объекты этихклассов будут взаимодействовать друг с другом.
Но конкретный механизмвзаимодействия все равно придется разложить на методы классов. В итогепротокол класса будет отражать поведение его объектов и работу механизмов,в которых они участвуют.Механизмы, таким образом, представляют собой стратегическиерешения в проектировании, подобно проектированию структуры классов.
Сдругой стороны, проектирование интерфейса какого-то одного класса - этоскорее тактическое решение. Стратегические решения должны бытьвыполнены явно, иначе у нас получится неорганизованная толпа объектов,кидающихся выполнять работу, растал-Механизмы суть средства, с помощью которых объекты взаимодействуютдруг с другом для достижения необходимого поведения более высокого уровнякивая друг друга. В наиболее элегантных, стройных и быстрыхпрограммах воплощены тщательно разработанные механизмы.Механизмы представляют только один из шаблонов, которые мынаходим в структурированных системах.
Так, на нижнем конце своеобразнойбиологической пирамиды находятся идиомы. Это обороты, специфические дляязыков программирования или программистских культур, и отражающиеобщепринятые способы выражаться.25 Например, в CLOS не принятоиспользовать подчеркивание в именах функций или переменных, хотя в Adaэто дело обычное [59]. Изучая язык, приходится учить его идиомы, которыеобычно передаются в форме фольклора. Однако, как отметил Коплейн,идиомы играют важную роль в кодификации шаблонов низкого уровня.
Онзаметил, что "многие общепрограммистские действия идиоматичны" ипоэтому распознание таких идиом позволяет "использовать конструкции C++для выражения функциональности вне самого этого языка с сохранениемиллюзии, что они являются частью языка" [60].Место на верху пирамиды занимают среды разработки.
Средаразработки - это собрание классов, предназначенных для определеннойприкладной ситуации. Среда дает готовые классы, механизмы и услуги,которыми можно сразу пользоваться или приспосабливать для своих нужд.Если идиомы составляют часть программистской культуры, то средыразработки обычно - коммерческий продукт. Например, Apple MacApp и егопреемник Bedrock - среды, написанные на C++ и предназначенные дляпостроения приложений со стандартным интерфейсом пользователяMacintosh. Аналогичную роль для Windows играют Microsoft FoundationClasses и ObjectWindows корпорации Borland.25Определяющей характеристикой идиомы является то, что ее игнорирование илинарушение влечет немедленные социальные последствия: вы превращаетесь в йехуили, еще хуже, в чужака, не заслуживающего уважения.Примеры механизмов.
Рассмотрим механизм рисования,применяемый обычно в графических интерфейсах пользователя. Для того,чтобы представить какой-либо рисунок на экране, необходимы несколькообъектов: окно, вид, модель, которую надо показать, и, наконец, клиент,который знает, когда надо нарисовать модель, но не знает, как это сделать.Сначала клиент дает окну команду нарисовать себя. Так как окно можетвключать в себя ряд видов, оно в свою очередь приказывает каждому из нихнарисовать себя. Каждый вид посылает сообщение своей модели нарисоватьсебя, в результате чего и появляется изображение на экране. В этом механизмемодель полностью отделена от окна и вида, в котором она представлена: видымогут посылать сообщения моделям, но модели не могут посылать сообщениявидам.
Smalltalk использует вариант этого механизма, названный парадигмойModel-View-Controller, модель-вид-контроллер (MVC) [61].Механизмы, таким образом, представляют уровень повторногоиспользования в проектировании, более высокий, чем повторноеиспользование индивидуальных классов. MVC, например, является основойинтерфейса пользователя в языке Smalltalk. Эта парадигма в свою очередьстроится на базе механизма зависимостей, который вложен в поведениебазового класса языка Smalltalk (класса object) и часто используетсябиблиотекой классов языка Smalltalk.Примеры механизмов можно найти во многих системах.
Структуруоперационной системы, например, можно описать на высоком уровнеабстракции по тем механизмам, которые используются для диспетчеризациипрограмм. Система может быть монолитной (как MS-DOS), иметь ядро(UNIX) или представлять собой иерархию процессов (операционная системаTHE) [62]. В системах искусственного интеллекта использованыразнообразные механизмы принятия решений. Одним из наиболеераспространенных является механизм рабочей области, в которую каждыйиндивидуальный источник знаний независимо заносит свои сведения.
В такоммеханизме не существует центрального контроля, но любое изменение врабочей области может явиться толчком для выработки системой нового путирешения поставленной задачи [63]. Коад похожим образом выявил ряд общихмеханизмов в объектно-ориентированных системах, включая шаблонывременных ассоциаций, протоколирование событий и широковещательнуюрассылку сообщений [64]. Во всех случаях эти механизмы проявляются не какиндивидуальные классы, а как структуры сотрудничающих классов.На этом завершается наше изучение классификации и понятий,являющихся основой объектно-ориентированного проектирования.Следующие три главы посвящены самому методу, в частности системеобозначений, процессу проектирования и рассмотрению практическихпримеров.Выводы•Идентификация классов и объектов - важнейшая задача объектноориентированного проектирования; процесс идентификации состоит изоткрытия и изобретения.•Классификация есть проблема группирования (кластеризации) объектов.•Классификация - процесс последовательных приближений; трудностиклассификации обусловлены в основном тем, что есть многоравноправных решений.•Есть три подхода к классификации: классическое распределение покатегориям (классификация по свойствам), концептуальнаякластеризация (классификация по понятиям) и теория прототипов(классификация по схожести с прототипом).•Метод сценариев - это мощное средство объектно-ориентированногоанализа, его можно использовать для других методов: классическогоанализа, анализа поведения и анализа предметной области.•Ключевые абстракции отражают словарь предметной области; их находятлибо в ней самой, либо изобретают в процессе проектирования.•Механизмы обозначают стратегические проектные решенияотносительно совместной деятельности объектов многих различныхтипов.Дополнительная литератураПроблема классификации вечна.