Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 11
Текст из файла (страница 11)
В частности,программирование, не основанное на иерархических отношениях, не относится к OOP, аназывается программированием на основе абстрактных типов данных.В соответствии с этим определением не все языки программирования являются объектноориентированными. Страуструп определил так: «если термин объектно-ориентированный языквообще что-либо означает, то он должен означать язык, имеющий средства хорошей поддержкиобъектно-ориентированного стиля программирования...
Обеспечение такого стиля в свою очередьозначает, что в языке удобно пользоваться этим стилем. Если написание программ в стиле OOPтребует специальных усилий или оно невозможно совсем, то этот язык не отвечает требованиямOOP» [33]. Теоретически возможна имитация объектно-ориентированного программирования наобычных языках, таких, как Pascal и даже COBOL или ассемблер, но это крайне затруднительно.Карделли и Вегнер говорят, что: «язык программирования является объектно-ориентированнымтогда и только тогда, когда выполняются следующие условия:•Поддерживаются объекты, то есть абстракции данных, имеющие интерфейс в видеименованных операций и собственные данные, с ограничением доступа к ним.•Объекты относятся к соответствующим типам (классам).•Типы (классы) могут наследовать атрибуты супертипов (суперклассов)» [34].Поддержка наследования в таких языках означает возможность установления отношения«is-a» («есть», «это есть», « — это»), например, красная роза — это цветок, а цветок — эторастение.
Языки, не имеющие таких механизмов, нельзя отнести к объектно-ориентированным.Карделли и Вегнер назвали такие языки объектными, но не объектно-ориентированными.Согласно этому определению объектно-ориентированными языками являются Smalltalk, ObjectPascal, C++ и CLOS, a Ada — объектный язык. Но, поскольку объекты и классы являютсяэлементами обеих групп языков, желательно использовать и в тех, и в других методы объектноориентированного проектирования.Объектно-ориентированное проектирование. Программирование прежде всего подразумевает правильное и эффективное использование механизмов конкретных языковпрограммирования.
Проектирование, напротив, основное внимание уделяет правильному иэффективному структурированию сложных систем. Мы определяем объектно-ориентированноепроектирование следующим образом:Объектно-ориентированное проектирование — это методология проектирования,соединяющая в себе процесс объектной декомпозиции и приемы представления логической ифизической, а также статической и динамической моделей проектируемой системы.В данном определении содержатся две важные части: объектно-ориентированноепроектирование 1) основывается на объектно-ориентированной декомпозиции; 2) используетмногообразие приемов представления моделей, отражающих логическую (классы и объекты) ифизическую (модули и процессы) структуру системы, а также ее статические и динамическиеаспекты.Именно объектно-ориентированная декомпозиция отличает объектно-ориентированноепроектирование от структурного; в первом случае логическая структура системы отражаетсяабстракциями в виде классов и объектов, во втором — алгоритмами.
Иногда мы будемиспользовать аббревиатуру OOD, object-oriented design, для обозначения метода объектноориентированного проектирования, изложенного в этой книге.Объектно-ориентированный анализ. На объектную модель повлияла более ранняямодель жизненного цикла программного обеспечения. Традиционная техника структурногоанализа, описанная в работах Де Марко [35], Иордана [36], Гейна и Сарсона [37], а с уточнениямидля режимов реального времени у Варда и Меллора [38] и Хотли и Пирбхая [39], основана напотоках данных в системе. Объектно-ориентированный анализ (или 00A, object-oriented analysis)направлен на создание моделей реальной действительности на основе объектно-ориентированногомировоззрения.Объектно-ориентированный анализ — это методология, при которой требования ксистеме воспринимаются с точки зрения классов и объектов, выявленных в предметной области.Как соотносятся ООА, OOD и OOP? На результатах ООА формируются модели, накоторых основывается OOD; OOD в свою очередь создает фундамент для окончательнойреализации системы с использованием методологии OOP.2.2.
Составные части объектного подходаПарадигмы программированияДженкинс и Глазго считают, что «в большинстве своем программисты используют вработе один язык программирования и следуют одному стилю. Они программируют в парадигме,навязанной используемым ими языком. Часто они оставляют в стороне альтернативные подходы кцели, а следовательно, им трудно увидеть преимущества стиля, более соответствующегорешаемой задаче» [40]. Бобров и Сте-тик так определили понятие стиля программирования: «Этоспособ построения программ, основанный на определенных принципах программирования, ивыбор подходящего языка, который делает понятными программы, написанные в этом стиле» [41].Эти же авторы выявили пять основных разновидностей стилей программирования, которыеперечислены ниже вместе с присущими им видами абстракций:• процедурно-ориентированныйалгоритмы• объектно-ориентированныйклассы и объекты• логико-ориентированныйцели, часто выраженные в терминах исчисленияпредикатов• ориентированный на правилаправила «если-то»• ориентированный на ограничения инвариантные соотношенияНевозможно признать какой-либо стиль программирования наилучшим во всех областяхпрактического применения.
Например, для проектирования баз знаний более пригоден стиль,ориентированный на правила, а для вычислительных задач — процедурно-ориентированный. Понашему опыту объектно-ориентированный стиль является наиболее приемлемым дляширочайшего круга приложений; действительно, эта парадигма часто служит архитектурнымфундаментом, на котором мы основываем другие парадигмы.Каждый стиль программирования имеет свою концептуальную базу. Каждый стильтребует своего умонастроения и способа восприятия решаемой задачи. Для объектноориентированного стиля концептуальная база — это объектная модель.
Она имеет четыреглавных элемента:• абстрагирование• инкапсуляция• модульность• иерархия.Эти элементы являются главными в том смысле, что без любого из них модель не будетобъектно-ориентированной. Кроме главных, имеются еще три дополнительных элемента:• типизация• параллелизм• сохраняемость.Называя их дополнительными, мы имеем в виду, что они полезны в объектной модели, ноне обязательны.Без такой концептуальной основы вы можете программировать на языке типа Smalltalk,Object Pascal, C++, CLOS, Eiffel или Ada, но из-под внешней красоты будет выглядывать стильFORTRAN, Pascal или С. Выразительная способность объектно-ориентированного языка будетлибо потеряна, либо искажена.
Но еще более существенно, что при этом будет мало шансовсправиться со сложностью решаемых задач.АбстрагированиеСмысл абстрагирования. Абстрагирование является одним из основных методов,используемых для решения сложных задач. Хоар считает, что «абстрагирование проявляется внахождении сходств между определенными объектами, ситуациями или процессами реальногомира, и в принятии решений на основе этих сходств, отвлекаясь на время от имеющихсяразличий» [42].
Шоу определила это понятие так: «Упрощенное описание или изложение системы,при котором одни свойства и детали выделяются, а другие опускаются. Хорошей является такаяабстракция, которая подчеркивает детали, существенные для рассмотрения и использования, иопускает те, которые на данный момент несущественны» [43]. Берзинс, Грей и На-уманрекомендовали, чтобы «идея квалифицировалась как абстракция только, если она может бытьизложена, понята и проанализирована независимо от механизма, который будет в дальнейшемпринят для ее реализации» [44].
Суммируя эти разные точки зрения, получим следующееопределение абстракции:Абстракция выделяет существенные характеристики некоторого объекта, отличающиеего от всех других видов объектов и, таким образом, четко определяет его концептуальныеграницы с точки зрения наблюдателя.Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяетотделить самые существенные особенности поведения от несущественных. Абельсон и Суссманназвали такое разделение смысла и реализации барьером абстракции [45], который основываетсяна принципе минимизации связей, когда интерфейс объекта содержит только существенныеаспекты поведения и ничего больше [46].
Мы считаем полезным еще один дополнительныйпринцип, называемый принципом наименьшего удивления, согласно которому абстракция должнаохватывать все поведение объекта, но не больше и не меньше, и не привносить сюрпризов илипобочных эффектов, лежащих вне ее сферы применимости.Выбор правильного набора абстракций для заданной предметной области представляетсобой главную задачу объектно-ориентированного проектирования. Ввиду важности этой темы ейцеликом посвящена глава 4.По мнению Сейдвица и Старка «существует целый спектр абстракций, начиная с объектов,которые почти точно соответствуют реалиям предметной области, и кончая объектами, неимеющими право на существование» [47].
Вот эти абстракции, начиная от наиболее полезных кнаименее полезным:• Абстракция сущностиОбъект представляет собой полезную модель некойсущности в предметной области• Абстракция поведенияОбъект состоит из обобщенного множестваопераций• Абстракция виртуальной машины Объект группирует операции, которые либо вместеиспользуются более высоким уровнем управления, либо сами используют некоторый наборопераций более низкого уровня• Произвольная абстракцияОбъект включает в себя набор операций, не имеющихдруг с другом ничего общегоМы стараемся строить абстракции сущности, так как они прямо соответствуют сущностямпредметной области.Клиентом называется любой объект, использующий ресурсы другого объекта(называемого сервером). Мы будем характеризовать поведение объекта услугами, которые оноказывает другим объектам, и операциями, которые он выполняет над другими объектами.
Такойподход концентрирует внимание на внешних проявлениях объекта и приводит к идее, которуюМейер назвал контрактноймоделью программирования [48]: внешнее проявление объектарассматривается с точки зрения его контракта с другими объектами, в соответствии с этим должнобыть выполнено и его внутреннее устройство (часто во взаимодействии с другими объектами).Контракт фиксирует все обязательства, которые объект-сервер имеет перед объектом-клиентом.Другими словами, этот контракт определяет ответственность объекта — то поведение, закоторое он отвечает [49].Каждая операция, предусмотренная этим контрактом, однозначно определяется ееформальными параметрами и типом возвращаемого значения. Полный набор операций, которыеклиент может осуществлять над другим объектом, вместе с правильным порядком, в котором этиоперации вызываются, называется протоколом.