На этом шаге мы рассмотрим предпосылки появления объектно-ориентированного программирования.
Методы структурного программирования помогают упростить процесс разработки сложных систем за счет использования алгоритмов как готовых строительных блоков. Аналогично методы объектно-ориентированного программирования (ООП) призваны помочь разработчикам в создании программ, где в качестве блоков используются классы и объекты.
В основе ООП лежит использование объектной модели, при создании которой нужно учесть большое количество различных факторов. Объектный подход зарекомендовал себя как унифицирующая идея всей компьютерной науки, применимая не только в программировании, но и также в проектировании интерфейса пользователя, баз данных и даже архитектуры компьютеров. Причина такой широты заключается в том, что ориентация на объекты позволяет справляться со сложностью систем самой разной природы.
Существует достаточно большое количество определений понятия объект. Г.Буч под объектом понимает осязаемую сущность, которая четко проявляет свое поведение[1]. Стефик и Бобров определяют объект как сущности, объединяющие процедуры и данные, так как они производят вычисления и сохраняют свое локальное состояние [2]. Джонс уточняет это определение: "В объектном подходе акцент переносится на конкретные характеристики физической или абстрактной системы, являющейся предметом программного моделирования… Объекты обладают целостностью, которая не должна - а, в действительности, не может быть нарушена. Объект может менять только состояние, вести себя, управляться или становиться в определенное отношение к другим объектам. Иначе говоря, свойства, которые характеризуют объект и его поведение, остаются неизменными. Например, лифт характеризуется теми неизменными свойствами, что он может двигаться вверх и вниз, оставаясь в пределах шахты… Любая модель должна учитывать эти свойства лифта, так как они входят в его определение" [3].
Йонесава и Токоро свидетельствуют, что термин объект появился в начале 70-х годов практически независимо в различных областях, связанных с компьютерами. Объектами назывались компоненты системы или фрагменты представления знаний [4]. По мнению Леви объектно-ориентированный подход был связан со следующими событиями:
К этому следует добавить три момента, оказавшие определенное влияние на становление объектного подхода к программированию. Это:
Понятие объект впервые было использовано в работах, связанных с созданием компьютеров, архитектура которых отличается от традиционной архитектуры фон Неймана, и применялось для преодоления барьера между высоким уровнем программной абстракции и низким уровнем ЭВМ [5, 6]. Был создан ряд компьютеров, имеющих объектно-ориентированную структуру.
С объектно-ориентированной архитектурой тесно связаны объектно-ориентированные операционные системы (ОС). Среди первых объектно-ориентированных ОС следует отметить CAP (для компьютера Cambridge CAP), ULCA Secure UNIX (для PDP 11/45 и 11/70) и др.
Наиболее значительный вклад в развитие объектного подхода был внесен объектно-ориентированными языками программирования. Впервые понятия классов и объектов появились в языке программирования Simula 67. Система Flex и последовавшие за ней диалекты Smalltalk-72, -74, -76, -80, взяв за основу методы Simula, довели их до логического завершения, выполняя все действия на основе классов. В 70-х годах прошлого столетия было создан ряд языков, реализующих идею абстракции данных (Alphard, CLU, Euclid, Gypsy, Mesa, Modula). Затем методы, используемые в языках Simula и Smalltalk, были использованы в традиционных языках высокого уровня. Внесение объектно-ориентированного подхода в C привело к возникновению языков C++, Objective C. На основе языка Pascal возникли Object Pascal, Eiffel и Ada. Появились диалекты LISP, такие, как Flavor, LOOPS и CLOS (Common LISP Object System), с возможностями языков Simula и Smalltalk.
Развивающиеся достаточно независимо технологии построения баз данных также оказали влияние на развитие объектного подхода, в первую очередь благодаря использованию модели "сущность - явление". В таких моделях, впервые предложенных Ченом [7], моделирование происходит в терминах сущностей, их атрибутов и взаимоотношений.
Разработчики способов представления данных в области искусственного интеллекта также внесли свой вклад в развитие объектно-ориентированных технологий. В 1975 году Мински предложил теорию фреймов для представления реальных объектов в системах распознавания образов и естественных языков [8]. Фреймы стали использоваться в качестве архитектурной основы в различных интеллектуальных системах.
Определим теперь объектно-ориентированное программирование.
В приведенном определении можно выделить три части:
Программа будет объектно-ориентированной только при соблюдении указанных условий. В частности, программирование, не основанное на иерархических отношениях, не относится к ООП, а называется программированием на основе абстрактных типов данных.
В соответствии с приведенным определением не все языки программирования являются объектно-ориентированными. По мнению Б.Страуструпа, термин "объектно-ориентированный язык" означает, что этот язык имеет средства хорошей поддержки объектно-ориентированного стиля программирования, то есть при программировании на этом языке удобно пользоваться данными средствами. Если написание программ в стиле ООП требует специальных усилий или невозможно совсем, то такой язык не отвечает требованиям ООП [9]. Карделли и Вагнер сформулировали необходимые условия объектно-ориентированного языка программирования:
На следующем шаге мы перечислим составные части объектного подхода.