им видами абстракций:
• процедурно-ориентированный алгоритмы
• объектно-ориентированный классы и объекты
• логико-ориентированный цели, часто выраженные в терминах исчисления предикатов
• ориентированный на правила правила 'если-то'
• ориентированный на ограничения инвариантные соотношения
Невозможно признать какой-либо стиль программирования наилучшим во всех областях практического применения. Например, для проектирования баз знаний более пригоден стиль, ориентированный на правила, а для вычислительных задач - процедурно-ориентированный. По нашему опыту объектно- ориентированный стиль является наиболее приемлемым для широчайшего круга приложений; действительно, эта парадигма часто служит архитектурным фундаментом, на котором мы основываем другие парадигмы.
Каждый стиль программирования имеет свою концептуальную базу. Каждый стиль требует своего умонастроения и способа восприятия решаемой задачи. Для объектно-ориентированного стиля концептуальная база - это
• абстрагирование;
• инкапсуляция;
• модульность;
• иерархия.
Эти элементы являются
• типизация;
• параллелизм;
• сохраняемость.
Называя их
Без такой концептуальной основы вы можете программировать на языке типа Smalltalk, Object Pascal, C++, CLOS, Eiffel или Ada, но из-под внешней красоты будет выглядывать стиль FORTRAN, Pascal или С. Выразительная способность объектно-ориентированного языка будет либо потеряна, либо искажена. Но еще более существенно, что при этом будет мало шансов справиться со сложностью решаемых задач.
Абстрагирование
Смысл абстрагирования. Абстрагирование является одним из основных методов, используемых для решения сложных задач. Хоар считает, что 'абстрагирование проявляется в нахождении сходств между определенными объектами, ситуациями или процессами реального мира, и в принятии решений на основе этих сходств, отвлекаясь на время от имеющихся различий' [42]. Шоу определила это понятие так: 'Упрощенное описание или изложение системы, при котором одни свойства и детали выделяются, а другие опускаются. Хорошей является такая абстракция, которая подчеркивает детали, существенные для рассмотрения и использования, и опускает те, которые на данный момент несущественны' [43]. Берзинс, Грей и Науман рекомендовали, чтобы 'идея квалифицировалась как абстракция только, если она может быть изложена, понята и проанализирована независимо от механизма, который будет в дальнейшем принят для ее реализации' [44]. Суммируя эти разные точки зрения, получим следующее определение абстракции:
Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных. Абельсон и Суссман назвали такое разделение смысла и реализации
Выбор правильного набора абстракций для заданной предметной области представляет собой главную задачу объектно-ориентированного проектирования. Ввиду важности этой темы ей целиком посвящена глава 4.
По мнению Сейдвица и Старка 'существует целый спектр абстракций, начиная с объектов, которые почти точно соответствуют реалиям предметной области, и кончая объектами, не имеющими право на существование' [47]. Вот эти абстракции, начиная от наиболее полезных к наименее полезным:
• Абстракция сущности Объект представляет собой полезную модель некой сущности в предметной области
• Абстракция поведения Объект состоит из обобщенного множества операций
• Абстракция виртуальной машины Объект группирует операции, которые либо вместе используются более высоким уровнем управления, либо сами используют некоторый набор операций более низкого уровня
• Произвольная абстракция Объект включает в себя набор операций, не имеющих друг с другом ничего общего
Мы стараемся строить абстракции сущности, так как они прямо соответствуют сущностям предметной области.
Каждая операция, предусмотренная этим контрактом, однозначно определяется ее формальными параметрами и типом возвращаемого значения. Полный набор операций, которые клиент может осуществлять над другим объектом, вместе с правильным порядком, в котором эти операции вызываются, называется
Центральной идеей абстракции является понятие инварианта.