Файл: История и развитие методологии объектно-ориентированного программирования. Сферы применения (ОСНОВНЫЕ ПОНЯТИЯ О ПРОГРАММИРОВАНИИ, ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ).pdf
Добавлен: 30.03.2023
Просмотров: 283
Скачиваний: 2
В ранней MIT-версии ALGOL AED-0 структуры данных («плексы» на диалекте Алгола) напрямую были связаны с процедурами, которые впоследствии были названы сообщениями, методами или функциями-членами.
Объекты, как формализованный концепт появились в программировании в 1960-х в Simula 67, модернизированной версии Simula I, языка программирования, ориентированного на дискретно-событийное моделирование. Авторы Simula — Оле-Йохан Даль и Кристен Нюгорд из Норвежского компьютерного центра в Осло. Simula разрабатывалась под влиянием SIMSCRIPT и предложенной Чарльзом Хоаром концепцией записей-классов. Simula включала в себя понятие классов и экземпляров (или объектов), а также подклассов, виртуальных методов, сопрограмм и дискретно-событийное моделирование как часть собственной парадигмы программирования.
В языке использовался автоматический сборщик мусора, который был изобретен ранее для функционального языка Lisp. Simula использовалась тогда преимущественно для физического моделирования. Идеи Simula оказали серьезное влияние на более поздние языки, такие как Smalltalk, варианты Lisp (CLOS), Object Pascal, и C++.
Язык Smalltalk, который был изобретен в компании Xerox PARC Аланом Кэем (Alan Kay) и некоторыми другими учеными, фактически навязывал использование «объектов» и «сообщений» как базиса для вычислений. Создателей Smalltalk вдохновляли некоторые идеи Simula, но Smalltalk разрабатывался как полностью динамичная система, в которой классы могут создаваться и изменяться динамически, а не только статически как в Simula. Smalltalk и ООП с его помощью были представлены широкой аудитории в журнале Byte magazine в августе 1981.
В 1970-х Smalltalk Кэя сподвиг сообщество Lisp внедрить в язык объектно-ориентированные техники, которые были представлены разработчикам с помощью Lisp машины.
В 1980 было несколько попыток дизайна архитектур процессоров, которые включали бы в себя аппаратную поддержку работы с объектами в памяти, но все они были безуспешны. В качестве примеров можно привести Intel iAPX 432 и Linn Smart Rekursiv.
Объектно-ориентированное программирование развилось в доминирующую методологию программирования в начале и середине 1990 годов, когда стали широко доступны поддерживающие ее языки программирования, такие как Visual FoxPro 3.0, C++, и Delphi.
Доминирование этой системы поддерживалось ростом популярности графических интерфейсов пользователя, которые основывались на техниках ООП. Пример тесной связи между динамической библиотекой GUI и объектно-ориентированного языка программирования можно найти посмотрев на фреймворк Cocoa на Mac OS X, который был написан на Objective-C, объектно-ориентированом расширении к С, основанном на Smalltalk с поддержкой динамических сообщений.
В ETH Zürich, Никлаус Вирт и его коллеги тоже исследовали такие предметы, как абстрация данных и модульное программирование, хотя эти подходы широко использовались и в 60-х и ранее.
Modula-2 вышедшая в 1978 включала оба эти подхода, а ее последователь Oberon имел собственный подход к объктно-ориентированности, классам и прочему, непохожий на подход Smalltalk и совсем не похожий на подход C++.
Возможности ООП добавлялись во многие языки того времени, включая Ada, BASIC, Fortran, Pascal и другие. Их добавление в языки, изначально не разрабатывавшиеся для поддержки ООП часто приводило к проблемам с совместимостью и поддержкой кода.
2.2. Характеристика понятий ООП
Рассмотрим основные понятия, которые связаны с понятием ООП.
Классом называется набор специальных функций и типизированных файлов, объединенных в совершенно новый тип данных.
В отличие от структур, типизированных данных и функций имеют различные уровни реализации доступа.[2]
Переменная, которая объявлена в программе, имеющая типом данных класс, называется объектом указанного класса.
Таким образом, под классом понимается структура, состоящая с некоторых переменных (или констант) и функций, а под объектом – область памяти, что занимает структура для ее объявления.
Для создания разных объектов предусмотрены функции, которые принадлежат классу, заполняющие поля объектов. Такие функции называются конструкторами.
При удалении разного рода объектов вызываются функции, что принадлежат классу и предназначены для освобождения памяти. Они называются деструкторами.
Определению класса в классическом программировании удовлетворяет понятие структуры.
В действительности, структура языка С++ реализована как класс, поля которой общедоступны в этом смысле, так как доступ к ним выполняется через имена:
название_структуры.поле, название_структуры.функция(параметры)
или указатели типа:
указатель->функция(аргумент), указатель->поле.
Самым простым образом класс определяется с помощью такой конструкции (рисунок 3): [18]
Рисунок 3 – Принцип оглашения конструкций
Первая пара служебных слов, которые записаны в фигурных скобках, обозначает альтернативный выбор только одного с ключевых слов, а другая пара –в себя включает имена и поля функций, что принадлежат классу.
Рассматриваемые функции называют составными функциями класса.
Заключенный в приведенные фигурные скобки список программного кода называется телом класса.
Непосредственное определение тела класса всегда заканчивается точкой с запятой.
Стоит отметить, что тело составной функции является определенным вне класса.
В данном случае для указанной функции определяется имя класса, членом которой она является: [9]
формат_возвращаемого_значения название_класса::функция(параметры)
{
. . .
}
Следует заметить, что указатель на объект, для которого принадлежит составная функция, может определиться при применении ключевого слова this.
Слияние функций и данных, работающих с указаными данными, является инкапсуляцией.
Получим, что:
класс = составные функции + данные.
Помимо инкапсуляции в ООП реализован механизм наследования, что позволяет строить иерархию типов, а также полиморфизм, который позволяет объектам отвечать на разные запросы соответственно их типу. [6]
Наследование реализовывается с помощью понятия так называемого производного класса (рисунок 4).
Рисунок 4 – Пример наследования
Класс считается производным от иного класса, если содержит он все функции и поля другого класса.
Если же класс не считается производным – он называется первичным.
Тело класса разбивается на несколько частей, соответствующие трем таким атрибутам: [3]
class название
{
protected:
. . .
private:
. . .
public:
. . .
}
Атрибут protected имеют те члены класса, которые доступны для дружественных и составных функций классов, что являются производными от указанного класса или же совпадают с ним. Такие члены класса называются защищенными.[16]
Атрибуты с спецификатором protected имеют такие члены класса, которые доступны для дружественных и составных функций классов, а также тех, что являются производными от указанного класса или же совпадают с ним. Стоит отметить, что такие члены класса являются защищенными.
Атрибут protected используют члены класса, которые доступны для дружественных или составных функций классов, что являются производными от указанного класса или же совпадают с ним.
Такие члены класса считаются защищенными.
Полиморфизм применяется для отделения кода программы от других его составных частей. Пример использования полиморфизма показан на рисунке 5:
Рисунок 5 – Пример использования полиморфизма
В общем понимании, принципом полиморфизма является идея, которая описывается словосочетанием «один интерфейс – много методов».[12]
Это значит, что можно выполнять создание общего интерфейса для определенной группы объектов по смыслу близких к нему действий. Самым основным преимуществом полиморфизма является то, что он также может помогать снижать уровень сложности ПО, разрешая применение аналогичного интерфейса.
Стоит заметить, что полиморфизм может использоваться и к многим операторам, например «+» применяется для сложения целых, символьных и других переменных.
В таком случае использованный компилятор определяет автоматически, именно какой тип арифметики надо и в каком случае применять. Такой формат полиморфизма называется перегрузкой операторов.
К примеру, класс «Насекомые» имеет определенную манеру поведения, что можно характеризовать как «метод перемещения». [8]
Во втором разделе работы подробно описаны некоторые понятия теории ООП, рассмотрены главные принципы применения современных ЯП, которые поддерживают указанный подход.
3.ИСПОЛЬЗОВАНИЕ ЯП С++ ДЛЯ НАПИСАНИЯ ПРОГРАММ НА ООП
3.1. Обзор языков, которые используют ООП
Язык называют объектно-ориентированным, если реализованы в нем рассмотренные выше принципы ООП.
В теории современного программирования принято различать такие категории языков программирования:
– объектные ЯП;
– объектно-ориентированные ЯП.
Последние отличаются только тем, что они никак не поддерживают принципы наследования свойств непосредственно в иерархии абстракций, к примеру, Ада является объектным языком, а C++ – объектно-ориентированным.[4]
Несмотря на это и то, что принципиально ООП можно применять на многих ЯП, желательно для создания программ с применением объектной ориентированности использовать объектно-ориентированные ЯП, включающие специальные средства, к примеру, C++, Borland Pascal, Delphi и т.п.
Самая обычная объектная модель применена при разработке программной системы Borland Pascal 7.0.
Она создавалась специально для облегчения перехода программиста на применение технологии ООП, а также не поддерживает абстракцию метаклассов, не содержит специальных инструментов сокрытия реализации объектов. [20]
В таком варианте она дает возможность создавать достаточно сложные программные системы.
Все объектные модели для остальных ЯП являются практически полными.
Отдельное место занимают в ООП объектные модели C++Builder и Delphi.
Эти модели значительно обобщают опыт ООП MS DOS, а также включают более новые средства, что обеспечиваю эффективное создание намного сложных систем.
На основании этих моделей созданы специальные визуальные среды для проектирования приложений Windows.
Основная сложность программирования под ОС Windows удалось существенно.
Авторы языка Simula очень точно угадали все перспективы развития программирования, а именно, их ЯП намного лет опередил свое время. Но современники (программисты 1960-х годов) оказались принципиально не готовы воспринимать ценности языка, и он конкуренции не выдержал с иными языками программирования.[15]
Прохладному отношению к Simula способствовало и обстоятельство, что реализовывался как интерпретируемый (не компилируемый) язык, а это было совершенно неприемлемым для 1960-х гг., так как интерпретация была связана с непосредственным снижением эффективности (то есть, скорости выполнения) ПО.
Но достоинства этого языка были замечены некоторыми опытными программистами, и в 1970-е годы разработано большое количество экспериментальных объектно-ориентированных ЯП:[10]
– Alphard;
– CLU;
– Concurrent Pascal и прочие.
Эти языки программирования так и остались быть экспериментальными, хотя в результате исследования были разработаны объектно-ориентированные языки C++, Eiffel и другие.
Самым распространенным объектно-ориентированным языком безусловно является ЯП C++.
Свободно распространяемые системы программирования на языке C++ существуют на любой платформе и для всякой операционной системы. Разработка принципиально новых объектно-ориентированных ЯП продолжается и теперь.
С 1994 года стал широко применяться новый объектно-ориентированный язык Java, ориентированный на сетевое использование компьютеров и Internet.
Синтаксис рассматриваемого языка напоминает синтаксис C++, однако такие языки имеют между собой мало общего.
Java считается интерпретируемым языком программирования, для него определены специальные внутренние представление и интерпретатор этого представления, что уже сейчас реализован на большинстве платформ.
Стоит отметить, что интерпретатор упрощает отладку программного обеспечения, написанных на ЯП Java, обеспечивает их принцип переносимости на более новые платформы, адаптируемость к новым средам применения.[5]