Файл: История и развитие методологии объектно-ориентированного программирования..pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 16.05.2023

Просмотров: 332

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Именно наследование дает возможность повторно использовать уже существующий код, как отмечается автором [7, с. 207]. С целью применения существующего кода, программист создает новый класс на базе уже существующих классов. В итоге, наследование выполняет две функции: предотвращение дублирования кода, развитие работы в нужном направлении. Отношения между родительскими классами и его потомками именуется термином «Иерархия наследования».

Под полиморфизмом подразумевается свойство родственных объектов решать схожие по смыслу проблемы разными способами. Например, действие «бежать» свойственно большинству животных. Но каждое из них действует различным образом [16, с. 144].

Полиморфизм — присваивание действию одного имени, которое затем совместно используется вниз и вверх по иерархии объектов, причем каждый объект иерархии выполняет это действие способом, именно ему подходящим. «Полиморфизм» представляет собой способность обладать несколькими формами, отмечается автором [21]. В объектно-ориентированной разработке это относится к сущностям (элементам структур данных), способным в процессе выполнения присоединяться к объектам разных типов.

Полиморфизм дает возможность применения одних и тех же функций для решения различных задач и находит свое отражение в том, что под одним именем содержатся разные действия, наполнение которых зависит от типа объекта. Производные одного базового класса считаются полиморфными. Это подразумевает, что им присущи как общие характеристики, так и собственные свойства.

Касательно средств, которые связаны с возможностью реализации полиморфизма, то следует упомянуть следующие виды методов в ООП:

  1. Статические методы класса включаются в код программы в процессе ее компиляции. Таким образом, до запуска программы уже известно, какая процедура будет вызвана в определенной точке.
  2. Виртуальные методы, которые подключаются к основному коду на этапе выполнения программы и дают возможность определить тип и конкретизировать экземпляр объекта в процессе исполнения, а затем вызвать методы этого объекта. Данный механизм обеспечивает полиморфизм и именуется также поздним связыванием.

Фленов М.Е. [19, с. 50] объясняет возможность полиморфизма на примере гаража, потомком которого выступает дом: «Представим, что у гаража дверь открывается вверх, а у дома должна открываться в сторону. Дом происходит от гаража, поэтому у него дверь будет открываться тоже вверх. Как тогда быть? Вы просто должны изменить (переписать) у дома процедуру, отвечающую за открытие двери. Тогда дом получит все свойства гаража, но при открывании двери подставит свою процедуру». Иначе говоря, полиморфизм — различная реакция объектов разных иерархий на одно и то же событие.


Полиморфизм дает возможность создавать множественные определения для операций и функций. Какое именно определение будет использоваться, зависит от контекста программы. ООП предоставляет возможности, связанные с полиморфизмом, такие как: шаблоны функций, перегрузка функций, перегрузка операций, использование виртуальных методов, шаблоны классов [12, с. 163]. Перегрузка операций позволяет применять для собственных классов те же операции, что используются для встроенных типов C++. Виртуальные методы обеспечивают возможность выбрать на этапе выполнения нужный метод среди одноименных методов базового и производного классов. Шаблоны классов позволяют описать классы, инвариантные относительно типов данных.

Под инкапсуляцией понимается «свойство, благодаря которому разработчику, использующему определенный строительный блок (код), не нужно знать, как он на самом деле реализован и работает для корректного использования этого строительного блока» [19, с. 5].

Другое преимущество инкапсуляции заключается в том, что разработанную программу легче модифицировать, поскольку при сохранении интерфейса класса можно менять его реализацию, и это не затронет внешний программный код (код клиента).

Таким образом, основными понятиями ООП являются: класс, объект, метод, свойство, поле. Основными свойствами объектно-ориентированного языка программирования являются: наследование, полиморфизм, инкапсуляция, передача сообщений. Сами по себе эти принципы не новы, но в рамках объектной модели они существуют в синергическом единстве.

2. ИСТОРИЯ ПОЯВЛЕНИЯ И РАЗВИТИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

2.1. Поколения языков программирования

Объектно-ориентированная технология не выросла спонтанно на предыдущих методиках, потерпевших крах из-за устаревшей технологии проектирования, и не является радикальным пересмотром предшествующих подходов. На самом деле она вобрала в себя наилучшие идеи более ранних методологий [20, с. 35].

Вегнер (Wegner) выделил четыре поколения наиболее популярных языков программирования высокого уровня, положив в основу классификации новаторские языковые конструкции, впервые появившиеся в этих языках. (Разумеется, это далеко не исчерпывающий список всех языков программирования) [5, с.18]:


• Языки программирования первого поколения (1954–1958)

  • FORTRAN I Математические формулы
  • ALGOL-58 Математические формулы
  • Flowmatic Математические формулы
  • IPL V Математические формулы

• Языки программирования второго поколения (1959–1961)

  • FORTRAN II Подпрограммы, раздельная компиляция
  • ALGOL-60 Блочная структура, типы данных
  • COBOL Описание данных, работа с файлами
  • Lisp Обработка списков, указатели, сборка мусора

• Языки программирования первого поколения (1962–1970)

  • PL/I FORTRAN+ALGOL+COBOL
  • ALGOL-68 Ближайший наследник ALGOL-60
  • Pascal Простой наследник ALGOL-60
  • Simula Классы, абстракция данных

• Разрыв преемственности (1970–1980). В этот период было изобретено много языков, но лишь немногие из них выдержали испытание временем. Среди них заслуживают упоминания следующие языки.

  • C Эффективен; характеризуется малым размером исполняемых модулей
  • FORTRAN 77 Прошел стандартизацию ANSI

Продолжим классификацию Вегнера.

• Бум объектно-ориентированного программирования (1980–1990, проверку временем прошли лишь несколько языков)

  • Smalltalk 90 Чисто объектно-ориентированный язык
  • C++ Происходит от языков C и Simula
  • Ada83 Строгий контроль типов; сильное влияние языка Pascal
  • Eiffel Происходит от языков Ada и Simula

• Появление интегрированных сред (1990 и до настоящего времени)

  • Visual Basic Облегченное проектирование графического пользовательского интерфейса (graphical user interface — GUI) для приложений в операционной среде Windows
  • Java Наследник языка Oak; разрабатывался для мобильных устройств
  • Python Объектно-ориентированный язык сценариев
  • J2EE Интегрированная среда на базе языка Java для промышленного применения
  • .NET Интегрированная объектно-ориентированная среда, разработанная компанией Microsoft
  • Visual C# Конкурент языка Java для среды Microsoft .NET
  • Visual Basic .NET Вариант языка Visual Basic для среды Microsoft .NET [2, с. 60].

В каждом следующем поколении языков программирования механизмы абстракции изменялись. Языки первого поколения использовались, в основном, для научных и технических вычислений, и словарь этой предметной области был математическим. Первые программисты писали программы посредством использования машинных кодов. В связи со сложностью подобного подхода возникла необходимость создать программу, которая преобразовывала бы написанный человеком и понятный ему текст в машинные коды [19, с. 11]. Такая программа получила название «компилятор», а используемый для написания исходного текста программы язык — «языком программирования». Первым компилятором был «Assembler».


Рисунок 1. — Генеалогия наиболее важных языков программирования, согласно [19, с. 577]

Такие языки, как FORTRAN I, позволяли программистам записывать математические формулы, освобождая их от сложностей, связанных с ассемблером или машинным кодом. Таким образом, первое поколение языков высокого уровня было шагом в направлении предметной области и отступало от технических деталей компьютеров.

Языки программирования второго поколения перенесли акцент на алгоритмические абстракции. В то время мощность компьютеров все больше увеличивалась, а область их применения расширялась, особенно в экономической сфере. Основная задача заключалась в инструктировании машины: например, сначала прочитать анкеты сотрудников, затем упорядочить и после этого распечатать результаты на принтере. Языки программирования этого поколения продолжали отдаляться от компьютеров и приближаться к предметной области [11, с. 8].

В конце 1960-х годов, особенно после изобретения транзисторов и технологии интегральных схем, стоимость аппаратного обеспечения резко упала, а производительность компьютеров продолжала расти почти экспоненциально. Это позволяло решать еще более сложные задачи, но вынуждало программистов манипулировать более разнообразными видами данных. В результате возникли языки третьего поколения, такие как ALGOL-68 и Pascal, поддерживающие абстракцию данных. Теперь разработчики получили возможность описывать свои собственные виды данных (т.е. создавать пользовательские типы) и реализовывать проектные решения на языке программирования. Это поколение языков программирования еще больше удалилось от машинной архитектуры и приблизилось к предметной области [14, с. 11].

1970-е годы ознаменовались бурным всплеском активности в области разработки языков программирования. В результате было создано несколько тысяч разных языков программирования и их вариантов. Со временем необходимость разрабатывать все более крупные программы сделала очевидной неадекватность старых языков. Многие механизмы новых языков программирования разрабатывались именно для того, чтобы преодолеть эти ограничения. Лишь немногие из этих языков прошли проверку временем. Однако многие из концепций, воплощенных в этих языках, были внедрены в новых версиях более ранних языков [11, с. 10].

Наибольший интерес представляет класс языков, называемых объектными (object-based) и объектно-ориентированными (object-oriented). Эти языки лучше всего поддерживают объектно-ориентированную декомпозицию программного обеспечения. Большинство объектно-новых языков этой категории (и объектно-ориентированных вариантов старых языков программирования) появились в 1980-х и начале 1990-х годов. После 1990-го года появилось немного объектно-ориентированных языков программирования, поддерживаемых поставщиками коммерческого программного обеспечения (например, языки Java и C++). Появление интегрированных сред (например, J2EE и .NET), предоставляющих в распоряжение программистов огромное количество компонентов и сервисов, которые упростили решение типичных и рутинных задач, резко увеличило производительность их труда и продемонстрировало преимущества повторного использования кода.


На сегодняшний день существуют более 2500 языков программирования высокого уровня [19]. Это объясняется направленностью конкретных языков на определенные предметные области, а также тем, что появление новых языков дает возможность разработчикам решать все более сложные задачи.

Проанализировав путь развития основных языков программирования, можно выделить следующие постоянно присутствующие, сменяющие друг друга, тенденции:

  1. Смещение акцентов от частного (программирование деталей), к общему (программирование более крупных компонент).
  2. Развитие и совершенствование инструментария программиста (языков программирования высокого уровня и рабочей среды).
  3. Возрастание сложности программных и информационных систем [11, с. 6].

Именно расширение области применения информационных технологий и вычислительной техники служило и продолжает служить движущей силой эволюции методов и инструментов построения программных систем. На протяжении всей истории развития информационных технологий проводилось огромное множество прикладных исследований по методологии проектирования, декомпозиции, абстрагированию и иерархиям. Следствием этих исследований стало появление все более и более выразительных языков программирования. Возникла тенденция перехода от языков, указывающих компьютеру, что делать (императивные языки), к языкам, описывающим ключевые абстракции предметной области (декларативные языки).

2.2. Зарождение и развитие объектной модели

Абстракция данных играет важную роль в борьбе со сложностью. Осознание этого факта привело к двум важным последствиям. Во-первых, возникли методы информационного проектирования (data-driven design), систематизировавшие способы абстракции в алгоритмических языках. Во-вторых, стала разрабатываться теория типов данных.

Естественным следствием этих идей стало появление языков Simula, Smalltalk, Object Pascal, C++, Ada, Eiffel и Java. Эти языки называются объектными или объектно-ориентированными [10, с. 18].

Первым языком, в котором нашли свое выражение идеи построения программ на основе данных и объектов стал язык Simula 67. Язык Simula, разработанный в 1960-х годах считается общим предком большинства современных объектных и объектно-ориентированных языков. Данный язык дополнил идеи языка ALGOL концепцией инкапсуляции и наследования. На рисунке ниже представлена генеалогия наиболее значимых и популярных объектных и объектно-ориентированных языков программирования, где интенсивность разработки языка показана длиной прямоугольника, а стрелочки отображают влияние одних языков на другие. Язык «Симула» предлагал революционные идеи, такие как: объекты, классы, виртуальные методы, но которые не были тогда восприняты таковыми [16, с. 145].