На этом шаге рассмотрим основные положения объектной модели.
Методы объектно-ориентированного проектирования создавались, чтобы дать разработчикам мощные выразительные средства языков объектного и объектно-ориентированного программирования, в которых основными конструктивными элементами являются классы и объекты.
На развитие объектной модели влияло большое количество факторов, а не только объектно-ориентированное программирование. Объектный подход признан объединяющей концепцией компьютерной науки, которую можно применять не только в языках программирования, но также при разработке пользовательских интерфейсов, баз данных и даже компьютерной архитектуры. Причина такой универсальности заключается в том, что объектная ориентация позволяет справиться со сложностью, характерной для самых разных систем.
Объектно-ориентированный анализ и проектирование носят эволюционный, а не революционный характер. Они не отбрасывают достижений прежних методологий, а берут из них лучшее. Поскольку объектная модель является наследником нескольких концепций, ее терминология довольно запутанна. Например, для обозначения одного и того же понятия в языке Smalltalk используется термин метод (method), в языке C++ - виртуальная функция-член (virtual function-member), а в языке CLOS — обобщенная функция (generic function). Программисты, работающие на языке Object Pascal, C# и Java говорят о приведении типов (type coersion), а на языке Ada - о преобразовании типов (type conversion). Для того чтобы прояснить ситуацию, необходимо уточнить, что считается объектно-ориентированным, а что — нет.
Понятие объекта является центральным понятием в любой объектно-ориентированной теории. Объект - материальная сущность с четко определенным поведением. Объекты - "сущности, обладающие свойствами процедур и данных, поскольку они производят вычисления и сохраняют свое локальное состояние". Определение объекта как сущности в некоторой мере является спорным, но основная идея заключается в сочетании алгоритмических идей и абстракции данных. В объектной модели акцент переносится на четкое описание компонентов физической или абстрактной системы, моделируемой с помощью программ.
Объекты имеют некую "целостность", которая не должна — а, в действительности, не может — быть нарушена. Объект может только изменять состояние, выполнять действия, допускать манипуляции и взаимодействовать с другими объектами приемлемым способом. Иначе говоря, существуют инвариантные свойства, характеризующие объект и его поведение. Например, к числу инвариантных свойств лифта относится его способность передвигаться по шахте вверх и вниз... Любая модель лифта должна учитывать эти инварианты, поскольку они являются его неотъемлемым атрибутом.
Объектно-ориентированное программирование — это метод программирования, основанный на представлении программы в виде совокупности взаимодействующих объектов, каждый из которых является экземпляром определенного класса, а классы являются членами определенной иерархии наследования.
Необходимо обратить внимание на следующие важные части этого определения:
Программа считается объектно-ориентированной, только если выполнены все три указанных требования. В частности, программирование, не использующее наследование, называется не объектно-ориентированным, а программированием с помощью абстрактных типов данных. В соответствии с этим определением одни языки программирования являются объектно-ориентированными, а другие — нет.
С теоретической точки зрения существует возможность имитации объектно-ориентированного программирования с помощью обычных языков, таких как Pascal и даже COBOL или ассемблер, но это чрезвычайно трудно.
Поддержка наследования в объектно-ориентированных языках означает возможность выражения отношения "is а" среди типов (например, красная роза — это цветок, а цветок — это растение). Если язык не поддерживает механизм наследования, то его нельзя считать объектно-ориентированным, их можно назвать объектными (object-based). Согласно этому определению языки Smalltalk, Object Pascal, C++, Eiffel, CLOS, C# и Java являются объектно-ориентированными, a Ada83 — объектным. Однако, поскольку объекты и классы являются элементами обеих групп языков, очень желательно и вполне возможно использовать объектно-ориентированные методы, работая на языках программирования как первой, так и второй группы.
В программировании делается акцент на правильном и эффективном использовании механизмов конкретных языков программирования. В проектировании, наоборот, основное внимание уделяется правильному и эффективному структурированию сложных систем.
Объектно-ориентированное проектирование — это метод проектирования, сочетающий процесс объектно-ориентированной декомпозиции и систему обозначения для представления логической и физической, а также статической и динамической моделей проектируемой системы.
В данном определении обращают на себя внимание следующие две важные части:
Именно объектно-ориентированная декомпозиция отличает объектно-ориентированное проектирование от структурного. В первом случае для выражения логической структуры системы используются классы и объекты, а во втором - алгоритмические абстракции. Иногда объектно-ориентированным проектированием называют любой метод, ведущий к объектной декомпозиции.
Объектная модель испытала влияние ранних моделей жизненного цикла программного обеспечения. Объектно-ориентированный анализ (object-oriented analysis — ООА) главный акцент делает на создании моделей реальной действительности на основе объектно-ориентированного мировоззрения. Объектно-ориентированный анализ — это метод анализа, исследующий требования к системе с точки зрения классов и объектов, относящихся к словарю предметной области. Результатами объектно-ориентированного анализа являются модели, лежащие в основе объектно-ориентированного проектирования, которое в свою очередь позволяет разработать схему полной реализации системы с использованием объектно-ориентированного программирования.
На следующем шаге рассмотрим одну из составных частей объектного подхода - абстрагирование.