Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 34
Текст из файла (страница 34)
В языкахObject Pascal, C++, CLOS и Ada существует понятие модуля как отдельнойязыковой конструкции. Решение о месте декларирования классов и объектов вэтих языках является компромиссом между требованиями видимости искрытия информации. В общем случае модули должны быть функциональносвязными внутри и слабо связанными друг с другом. При этом следуетучитывать ряд нетехнических факторов, таких, как повторное использование,безопасность, документирование. Проектирование модулей - не более простойпроцесс, чем проектирование классов и объектов. О скрытии информацииПарнас, Клеменс и Вейс говорят следующее: "Применение этого принципа невсегда очевидно. Принцип нацелен на минимизацию стоимости программныхсредств (в целом за время эксплуатации), для чего от проектировщикатребуется способность оценивать вероятность изменений.
Такие оценкиосновываются на практическом опыте и знаниях предметной области, включаяпонимание технологии программирования и аппаратных особенностей" [61].Выводы• Объект характеризуется состоянием, поведением и идентичностью.• Структура и поведение одинаковых объектов описывается в общемдля них классе.• Состояние объекта определяет его статические и динамическиесвойства.• Поведение объекта характеризуется изменением его состояния впроцессе взаимодействия (посредством передачи сообщений) с другимиобъектами.• Идентичность объекта - это его отличия от всех других объектов.• Иерархия объектов может строиться на принципах связи илиагрегации.• Множество объектов с одинаковой структурой и поведениемявляется классом.• Шесть типов иерархий классов включают: ассоциирование,наследование, агрегация, использование, инстанцирование иметаклассирование.• Классы и объекты, образующие словарь предметной области,называются ключевыми абстракциями.• Структура, объединяющая множество объектов и обеспечивающая ихсовместное целенаправленное функционирование, называется механизмом.• Качество абстракций измеряется их зацеплением, связностью,достаточностью, полнотой и примитивностью.Дополнительная литератураМакЛеннан (MacLennan) [G 1982] обсуждал различие междузначениями и объектами.
Работа Меиера (Меуег) Ц 1987] предлагаетконтрактный подход к программированию.По поводу иерархии классов было написано много, особое вниманиеуделялось наследованию и полиморфизму. Работы Альбано (Albano) [G 1983],Аллена (Allen) [A 1982], Брахмана (Brachman) (J 1983], Хайлперна и Нгуена(Hailpern and Nguyen) [G 1987], и Вегнера и Здоника (Wegner and Zdonik) [J1988] создали блестящее теоретическое обоснование всех основных вопросови концепций. Кук и Палсберг (Cook and Palsberg) U 1989] и Турецкий(Touretzky) [G 1986] дали формальное истолкование семантики наследования.Вирт (Wirth) [] 1987] предложил сходные решения для обобщенныхструктурных типов в Oberon. Ингалс (Ingalls) [G 1986] дал полезноеобсуждение вопроса множественного полиморфизма. Грогоно (Grogono) [G1989] изучает взаимодействие полиморфизма и проверки типов, а Пондер иБач (Ponder and Buch) [G 1992] предупреждают об опасностях безграничногополиморфизма.
Практические рекомендации по эффективному использованиюнаследования предложили Мейер (Меуег) [G 1988] и Халберд и О'Брайан(Halberd and O'Brien) [G 1988]. ЛаЛонд и Пух (LaLonde and Pugh) U 1985]изучали задачи обучения эффективному использованию специализации иобобщения.Природа ролей и обязанностей абстракции подробна рассмотрена вработе Рубина и Голд-берга (Rubin and Goldberg) [В 1992], а также ВирфсБрока, Вилкерсона и Винера (Wirfs-Brock, Wilkerson and Wiener) [F 1990].Качество классов рассматривал также Коад (Coad)[F1991].Мейер (Меуег) [G 1986] изучал связи между обобщенными функциямии наследованием применительно к языку Eiffel.
Страуструп (Stroustrup) [G1988] предложил механизм параметризованных типов в C++. Протоколметаобъектов в CLOS описали в деталях Кишалец, Ривьерес и Бобров(Kiczales, Rivieres, and Bobrow) [G 1991].Альтернативу иерархии, основанной на классах, предоставляетделегирование, использующее только экземпляры. Этот подход детальнорассмотрел Стейн (Stein) [G 1987].Глава 4КлассификацияКлассификация - средство упорядочения знаний. В объектно-ориентированном анализеопределение общих свойств объектов помогает найти общие ключевые абстракции имеханизмы, что в свою очередь приводит нас к более простой архитектуре системы.
Ксожалению, пока не разработаны строгие методы классификации и нет правила,позволяющего выделять классы и объекты. Нет таких понятий, как "совершеннаяструктура классов", "правильный выбор объектов". Как и во многих техническихдисциплинах, выбор классов является компромиссным решением.На одной из конференций программистам был задан вопрос: "Какими правилами выруководствуетесь при определении классов и объектов?" Страуструп, разработчикязыка C++, ответил: "Это как поиск святого Грааля. Не существует панацеи".
Габриель,один из разработчиков CLOS, сказал: "Это вопрос, на который нет простого ответа. Япросто пробую" [1]. К счастью, имеется богатый опыт классификации в других науках,на основе которого разработаны методики объектно-ориентированного анализа.Каждая такая методика предлагает свои правила (эвристики) идентификации классов иобъектов. Они и будут предметом этой главы.4.1. Важность правильной классификацииКлассификация и объектно-ориентированноепроектированиеОпределение классов и объектов - одна из самых сложных задачобъектно-ориентированного проектирования. Наш опыт показывает, что этаработа обычносодержит в себе элементы открытия и изобретения.
С помощьюоткрытий мы распознаем ключевые понятия и механизмы, которые образуютсловарь предметной области. С помощью изобретения мы конструируемобобщенные понятия, а также новые механизмы, которые определяют правилавзаимодействия объектов. Поэтому открытие и изобретение - неотъемлемыечасти успешной классификации.
Целью классификации является нахождениеобщих свойств объектов. Классифицируя, мы объединяем в одну группуобъекты, имеющие одинаковое строение или одинаковое поведение.Разумная классификация, несомненно, - часть любой науки.Михальски и Степп утверждают: "неотъемлемой задачей науки являетсяпостроение содержательной классификации наблюдаемых объектов илиситуаций.
Такая классификация существенно облегчает понимание основнойпроблемы и дальнейшее развитие научной теории" [2]. Та же философияотносится и к инженерному делу. В области строительной архитектуры игородского планирования, как отмечает Алексан-дер, для архитектора "егопроектная деятельность, и скромная, и гигантская по размеру, управляетсяцеликом образами, которые он держит в своем сознании в данный момент, иего способностью комбинировать эти образы при создании нового проекта"[З].Неудивительно, что классификация затрагивает многие аспектыобъектно-ориентированного проектирования.
Она помогает определитьиерархии обобщения, специализации и агрегации. Найдя общие формывзаимодействия объектов, мы вводим механизмы, которые станутфундаментом реализации нашего проекта. Классификация помогаетправильно определить модульную структуру. Мы можем расположитьобъекты в одном или разных модулях, в зависимости от степени схожестиобъектов; зацепление и связность - всего лишь меры этой схожести.Классификация играет большую роль при распределении процессовмежду процессорами. Мы направляем процессы на один процессор или наразные в зависимости от того, как эти процессы связаны друг с другом.Трудности классификацииПримеры классификации.
В главе 3 мы определили объект какнечто, имеющее четкие границы. На самом деле это не вполне так. Границыпредметов часто неопределенны. Например, посмотрите на вашу ногу.Попытайтесь определить, где начинается и кончается колено. В разговорнойречи трудно понять, почему именно эти звуки определяют слово, а неявляются частью какого-то более длинного слова. Представьте себе, что выпроектируете текстовый редактор. Что считать классом - буквы или слова?Как понимать отдельные фразы, предложения, параграфы, документы? Какобращаться с произвольными, не обязательно осмысленными, блоками текста?Что делать с предложениями, абзацами и целыми документами соответствуют ли такие классы нашей задаче?То, что разумная классификация - трудная проблема, новостью неназовешь.
И поскольку есть параллели с аналогичными трудностями вобъектно-ориентированном проектировании, рассмотрим примерыклассификации в двух других научных дисциплинах: биологии и химии.Вплоть до XVIII века идея о возможности классификации живыхорганизмов по степени сложности была господствующей. Мера сложностибыла субъективной, поэтому неудивительно, что человек оказался в списке напервом месте.
В середине XVIII века шведский ботаник Карл Линнейпредложил более подробную таксономию для классификации организмов: онввел понятия рода и вида. Век спустя Дарвин выдвинул теорию, по котороймеханизмом эволюции является естественный отбор и ныне существующиевиды животных - продукт эволюции древних организмов. Теория Дарвинаосновывалась на разумной классификации видов. Как утверждает Дарвин,"натуралисты пытаются расположить виды, роды, семейства в каждом классев то, что называется натуральной системой.
Что подразумевается под этойсистемой? Некоторые авторы понимают некоторую простую схему,позволяющую расположить наиболее похожие живые организмы в один класси различные - в разные классы" [4]. В современной биологии термин"классификация" обозначает "установление иерархической системы категорийна основе предположительно существующих естественных связей междуорганизмами" [5]. Наиболее общее понятие в биологической таксономии царство, затем, в порядке убывания общности: тип (отдел), класс, отряд(порядок), семейство, род и, наконец, вид.