Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

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

Содержание:

ВВЕДЕНИЕ

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

Проектирование таких сложных систем с трудом укладывается в рамки традиционного подхода разработки, когда процесс создания системы рассматривается как последовательность отдельных завершенных этапов и считается, что работа имеет однонаправленный характер. К серьезным недостаткам этой модели в современных условиях можно отнести:

  1. Подход не применим к разработке сложных программных систем, состоящих из большого числа автономных модулей, в том числе и из-за сложности внесения в систему последующих изменений.
  2. Невозможности распараллеливания разработки.
  3. Ограниченность, мешающая возможностям автоматического программирования и модификации программ, и применения вспомогательных средств, основанных на базах знаний (САSЕ технологии).

Все вышеизложенное требует новых подходов к проектированию. На данный момент наиболее перспективным можно считать объектно-ориентированный подход проектирования (ОПП).

Объектно-ориентированная технология покоится на солидной технической основе, элементы которой образуют так называемую объектную модель проектирования (object model of development), или просто объектную модель.

Не подлежит никакому сомнению, что объектно-ориентированный анализ и проектирование в корне отличаются от традиционных методов структурного проектирования: они требуют совершенно иного подхода к декомпозиции и порождают архитектуру программного обеспечения, намного превосходящую возможности структурного программирования. В настоящее время объектно-ориентированный подход общепризнан.

Актуальность темы исследования заключается в том, что ООП является востребованной парадигмой программирования при разработке программного обеспечения, что обусловливает необходимость понимания ООП.

Целью работы выступает изучение истории и развития методологии объектно-ориентированного программирования, сферы его применения.

Задачи работы:

  1. Изучить основные понятия объектно-ориентированного программирования.
  2. Выявить основные свойства объектно-ориентированного программирования.
  3. Рассмотреть поколения языков программирования.
  4. Изучить зарождение и развитие объектной модели.
  5. Охарактеризовать преимущества применения объектно-ориентированного программирования.
  6. Рассмотреть примеры применения объектно-ориентированного программирования.

Объект исследования – объектно-ориентированное программирование.

Предмет исследования - история и развитие методологии объектно-ориентированного программирования, сферы его применения.

При написании работы были использованы учебные пособия, монографии, статьи и электронные ресурсы по теме исследования.

Большинство источников изданы в известных вузах страны (КГПИ, МГУ, Высшая школа экономики, Волгоградский государственный технический университет, ЮУрГУ и др.), являются пособиями для студентов, данные источники можно считать надежными. Остальные издания выпущены также известными издательствами, такими как «Питер», «Вильямс», «Бином», «Академия» и др., и также могут считаться достоверными.

При написании работы также использованы статьи в периодической печати. Журнал «Перспективы развития информационных технологий» выпускается с 2009 г., в него входят рубрики по информатике, кибернетике, связи и вычислительной технике. Выпускает журнал ООО «Центр развития научного сотрудничества» (г. Новосибирск). «Таврический научный обозреватель» — электронный журнал (сетевое интернет-издание), для публикаций результатов исследований научных и научно-педагогических работников, аспирантов, докторантов, соискателей. Издание цитируемое. Данные источники также можно считать надежными.

Наименее достоверными являются электронные ресурсы. Однако в основном использован такой ресурс, как сайт Интернет-университета информационных технологий — ИНТУИТ.ру. Также использован материал с сайта Федерального Государственного Бюджетного Образовательного Учреждения Высшего Образования «МГТУ «СТАНКИН» и ряда специализированных сайтов по программированию.

В целом, источники, использованные в работе можно считать надежными.

1. СУЩНОСТЬ ПАРАДИГМЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

1.1. Основные понятия объектно-ориентированного программирования

В соответствии с концепцией фон-Неймана — основателя теоретической концепции компьютерной техники, процессор обрабатывает данные, выполняя инструкции (команды), которые находятся в той же оперативной памяти, что и данные [3, с. 5]. Таким образом, можно выделить две основные сущности процесса обработки информации: код, как совокупность инструкций, и данные. Все программы в соответствии с выбранной технологией программирования концептуально организованы вокруг своего кода или вокруг своих данных.

Рассмотрим основные на сегодняшний день парадигмы программирования:

1. Процессно-ориентированная парадигма, при которой программа представляет собой ряд последовательно выполняемых операций — модель фон-Неймана. При этом код воздействует на данные. Языки, реализующие эту парадигму, называются процедурными или императивными. Такими языками являются, например, C, Pascal и др.

2. Объектно-ориентированная парадигма, при которой программа рассматривается как совокупность фрагментов кода, обрабатывающих отдельные совокупности данных — объекты. Эти объекты взаимодействуют друг с другом посредством так называемых интерфейсов. При этом данные управляют доступом к коду [7, с. 9].

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

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

Предлагаем следующее определение термина «объектно-ориентированное программирование»:

Согласно [23], «ООП — это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию на принципах наследуемости».

В данном определении можно выделить три части:

1. ООП использует в качестве базовых элементов объекты, а не алгоритмы;

2. Каждый объект является экземпляром какого-либо определенного класса;

3. Классы организованы иерархически.

Программа будет объектно-ориентированной только при соблюдении всех трех указанных условий. Для разработки объектно-ориентированных программ используются объектно-ориентированные языки программирования [9, с. 5].

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

Первым бросающимся в глаза отличием ООП от структурного программирования является использование классов. Класс — это тип, определяемый программистом, в котором объединяются структуры данных и функции их обработки. Конкретные переменные типа данных «класс» называются экземплярами класса, или объектами [12, с. 162].

Класс содержит константы и переменные, называемые полями, а также выполняемые над ними операции и функции. Функции класса называются методами (другое название — функции-члены). Предполагается, что доступ к полям класса возможен только через вызов соответствующих методов. Поля и методы являются элементами (членами) класса.

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

Класс - это «Совокупность свойств, методов и событий». При этом «совокупность» означает, что функционирование класса обеспечивается в совокупности методами, свойствами и событиями [19, с. 43].

Под объектом, согласно [19; 21], понимается экземпляр класса. Объект функционирует как единое целое, реагируя соответствующими методами на соответствующие события класса. Разница между понятиями объекта и класса заключается в том, что посредством класса осуществляется описание какой-либо сущности, что работает как шаблон, основа. Например, в случае с Delphi, для того, чтобы добавить на форму кнопку, следует объявить класс, описать свойства, методы и события, и, при переносе кнопки на форму, создается экземпляр этой кнопки, т.е. объект.

Немаловажно, что каждый класс должен включать в себя два обязательных метода: создать объект (конструктор), уничтожить объект (деструктор), а процесс создания объекта именуется инициализацией [19, с. 45]. Эти методы выделяют под свойства объекта память и освобождают ее, а также заполняют свойства значениями по умолчанию.

Существует так называемые права доступа, в зависимости от которых методы и классы видны другим классам. В Delphi, например, это public, private, protected, published [19, с. 51]. Открытыми для доступа должны быть лишь некоторые возможности класса.

Роль классов в ООП заключается в том, что они выполняют две функции, всегда разделенные до появления объектно-ориентированных технологий: класс — это одновременно и модуль и тип [21].

Под модулями понимаются структурные единицы, из которых состоит программа. Поскольку модуль всегда рассматривается как синтаксическая концепция, то разбиение на них влияет только на форму записи исходных кодов, не определяя их функциональность. Тип — это статистическое описание определенных динамических объектов — элементов данных, обрабатываемых в процессе выполнения программы.

Одним из важнейших достижений в области ООП является методология паттернов проектирования, иногда называемых шаблонами проектирования [12, с. 202]. Паттерн — это описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте. Паттерны выявляются по мере накопления опыта разработок, когда программист использует одну и ту же схему организации и взаимодействия объектов в разных контекстах. Паттерны предназначены, прежде всего, для инкапсуляции изменений.

Итак, при объектно-ориентированном подходе к программированию программа представляет собой совокупность взаимодействующих между собой данных — объектов. Функциональную возможность и структуру объектов задают классы — типы данных, определенные пользователем.

1.2. Основные свойства объектно-ориентированного программирования

К основным принципам ООП относятся [23]: пакетирование или инкапсуляция; наследование; полиморфизм; передача сообщений.

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

В работе [12] представлено несколько иное определение данного термина: «Наследование — механизм получения нового класса из существующего путем его дополнения или изменения».

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

Абстрактными типами называют типы верхних уровней иерархии, которые, как правило, не имеют экземпляров. Конкретными экземплярами зачастую обладают типы нижних уровней иерархии.

Наследственность в ООП — это его основа, как отмечает автор [19, с. 49]. Следует понимать, что потомок — класс, от которого происходят другие классы, наследует свойства предка — класса, который происходит либо порожден из другого класса. Следовательно, потомок всегда «знает», какими он обладает свойствами, а предок не может «знать» свойства своего потомка, поскольку не может «знать» те свойства, которые будут добавлены в новый класс. Данный метод наследования и принят в объектно-ориентированных языках, согласно [19, с. 50].

Именно наследование дает возможность повторно использовать уже существующий код, как отмечается автором [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].

Концепции, заложенные в языке Simula, получили свое развитие в серии языков Smalltalk-72,-74,-76,-80, а также в языках C++ и Objective C. Новый, отличный от процедурного, взгляд на программирование предложили Алан Кэй и Дэн Ингаллс в языке Smalltalk, в котором «класс» стал ключевой идее для остальных конструкций языка. Именно этот язык и считается первым широко известным объектно-ориентированным языком программирования.

При внесении объектно-ориентированного подхода в язык Pascal появился язык Object Pascal. В 90-х годах компания Sun представила миру язык Java, как воплощение идеи платформенной независимости и наиболее полную реализацию концепций объектно-ориентированного программирования, положенных в основу языков Simula 67, Smalltalk, C++ [16, с. 145].

В наше время количество прикладных языков программирования, реализующих парадигму ООП превышает количество языков, реализующих иные парадигмы. Наиболее популярные языки программирования (С++, Delphi, C#, Java и др.) воплощают объектную модель Симулы. Примерами языков, базирующихся на модели Smalltalk, являются Python и Ruby [22].

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

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

Программа, написанная на объектном языке, представляет собой совокупность объектов, каждый из которых принадлежит к определенному абстрактному типу данных (классу) и имеет интерфейс в виде набора методов для взаимодействия друг с другом (посылки сообщений) [7, с. 63].

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

К сожалению, поскольку объектная модель является наследником нескольких концепций, ее терминология довольно запутанна. Например, для обозначения одного и того же понятия в языке Smalltalk используется термин метод (method), в языке C++ - виртуальная функция-член (virtual function-member), а в языке CLOS - обобщенная функция (generic function). Программисты, работающие на языке Object Pascal, C# и Java говорят о приведении типов (type coersion, or cast), а на языке Ada - о преобразовании типов (type conversion). Для того чтобы прояснить ситуацию, необходимо уточнить, что считается объектно-ориентированным, а что - нет [2, с. 85].

Страуструп (Stroustrup) полагает: «Если термин «объектно-ориентированный язык» вообще имеет смысл, то он должен относиться к языку, хорошо поддерживающему объектно-ориентированный стиль программирования… Поддержка такого стиля программирования считается хорошей, если средства языка обеспечивают удобное использование этого стиля. Язык не поддерживает объектно-ориентированное программирование, если написание программ в этом стиле требует особых усилий или опыта; в этом случае говорят, что язык просто позволяет программистам использовать объектно-ориентированный подход» [17]. С теоретической точки зрения существует возможность имитации объектно-ориентированного программирования с помощью обычных языков, таких как Pascal и даже COBOL или ассемблер, но это чрезвычайно трудно.

Карделли (Cardelli) и Вегнер (Wegner) утверждают:

«Язык программирования является объектно-ориентированным тогда и только тогда, когда он удовлетворяет следующие условия.

  1. Он поддерживает объекты, представляющие собой абстракции данных с интерфейсом в виде именованных операций и сокрытым локальным состоянием.
  2. Объекты имеют ассоциированный с ними тип (класс).
  3. Типы (классы) могут наследовать атрибуты супертипов (суперклассов)» [2, с.87].

Поддержка наследования в объектно-ориентированных языках означает возможность выражения отношения «is a» среди типов (например, красная роза - это цветок, а цветок - это растение). Если язык не поддерживает механизм наследования, то его нельзя считать объектно-ориентированным. Карделли и Вегнер предлагают называть такие языки объектными (object-based), а не объектно-ориентированными (object-oriented). Согласно этому определению языки Smalltalk, Object Pascal, C++, Eiffel, CLOS, C# и Java являются объектно-ориентированными, а Ada83 - объектным (позднее в язык Ada95 были добавлены объектно-ориентированные языки). Однако, поскольку объекты и классы являются элементами обеих групп языков, очень желательно и вполне возможно использовать объектно-ориентированные методы, работая на языках программирования как первой, так и второй группы [15, с. 21].

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

Программа, написанная на объектно-ориентированном языке, представляет собой совокупность объектов, каждый из которых принадлежит к определенному абстрактному типу данных (классу), а классы образуют иерархию наследования [14, с. 66].

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

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

Буч дает следующее определение объектно-ориентированного проектирования:

Объектно-ориентированное проектирование - это методология проектирования, соединяющая в себе процесс объектной декомпозиции и приемы представления логической и физической, а также статической и динамической моделей проектируемой системы [2, с. 135].

Именно объектно-ориентированная декомпозиция отличает объектно-ориентированное проектирование от структурного; в первом случае логическая структура системы отражается абстракциями в виде классов и объектов, во втором — алгоритмами.

По аналогии с проектированием можно выделить отличительные особенности объектно-ориентированного анализа (ООА) по сравнению со структурным анализом, основанным на потоках данных в системе [11, с. 36].

Буч определяет ООА следующим образом:

Объектно-ориентированный анализ - это методология, при которой требования к системе воспринимаются с точки зрения классов и объектов, выявленных в предметной области [2, с. 139].

Можно дать современные пояснения роли и сути ООА в процессе разработке программного обеспечения основываясь на методологии RUP (Rational Unified Process). Основными объектами, с которыми оперирует объектно-ориентированный анализ являются прецеденты взаимодействия (Use-Cases) и актеры (Actors). Причем, прецеденты взаимодействий рассматриваются в сфере отношений, схожих с отношениями возникающими между классами (расширения (extention), включения (inclusion), генерализации (generalization)).

Подводя итог рассмотрению истории развития языков и методологий программирования, следует упомянуть парадигмы различных методов построения программных систем, сформулированные Страуструпом [17].

  1. Процедурное программирование: Реши, какие требуются процедуры; используй наилучшие доступные алгоритмы.
  2. Модульное программирование: Реши, какие требуются модули; разбей программу так, чтобы скрыть данные в модулях.(Принцип сокрытия данных)
  3. Объектное программирование: Реши, какие требуются типы; обеспечь полный набор операция для каждого типа.
  4. Объектно-ориентированное программирование: Реши, какие требуются классы; обеспечь полный набор операций для каждого класса; явно вырази общность через наследование.
  5. Обобщенное программирование: Реши, какие требуются алгоритмы; параметризуй их так, чтобы они могли работать со множеством подходящих типов и структур данных.

Таким образом, после процедурного подхода к программированию, следующей ступенью в развитии технологий программирования стало появление ООП.

Наиболее важными событиями, связанными с историей ООП считаются появление языка «Симула», содержащего базовые аспекты ООП, а также возникновение языка Smalltalk — первого объектно-ориентированного языка программирования.

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

3.1. Преимущества применения объектно-ориентированного программирования

Объектно-ориентированное программирование предполагает эффективную реализацию проектов в первую очередь на традиционных объектно-ориентированных языках программирования «с классами» типа C++, Object Pascal, C#, VB .NET и др. [20, с. 114].

Сторонники объектно-ориентированного подхода рассматривают разработку программного комплекса автоматизации процесса решения тех или иных задач с точки зрения вовлекаемых в этот процесс объектов. Что это дает?

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

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

Появление новой методологии объектно-ориентированного анализа и проектирования вызвано сложностью моделирования предметной области и разработки объемных (например, корпоративных) информационных систем [3, с. 34].

На практике, как правило, применяют оба подхода:

  • для проектирования сложной системы в целом до уровня классов и их методов используют ООАП, а
  • для реализации отдельных методов или решения несложной (разовой) задачи используют процедурно-ориентированное проектирование [3, с. 35].

Таким образом, оба рассмотренных подхода к проектированию остаются актуальными.

Возлагается надежда, что метод ООП упростит написание более сложных программ. Парадоксальность ООП заключается в том, что:

1) это новая идея о том, что собственно называется вычислениями, а также того, как мы можем структурировать информацию в памяти компьютера;

2) это эволюционный шаг, естественным образом вытекающий из предшествующей истории развития средств абстракции данных [1, с. 4].

Можно выделить три основных причины популярности ООП:

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

2) желание перейти от существующих языков к новой технологии;

3) сходство с методами проектирования, применяющимися в других инженерных областях (сборка изделия из готовых блоков) [1, с. 5].

Недостаток же процедурно-ориентированных языков заключается в наличии двух проблем: неограниченный доступ функций к глобальным данным и тот факт, что разделение данных и функций, которое является основой структурного подхода, плохо отображает картину реального мира [4, с. 34].

Таким образом, программно-ориентированное программирование имеет как преимущества, так и недостатки. При этом, наряду с ним, остается актуальным и процедурно-ориентированное проектирование.

3.2. Примеры применения объектно-ориентированного программирования

Возможно, самым первым и наиболее хорошо известным случаем крупномасштабного ус­пешного применении объектно-ориентированной технологии можно считать ее использование компанией Brooklyn Union Gas. Эта компании заменила систему управлении клиентами, содержащую 1,5 миллиона строк кода на языке PL/1, другой системой, написанной с исполь­зованием объектно-ориентированного препроцессора. Новая система была очень большой. Она была рассчитана на 850 интерактивных пользователей, включала базу данных размером 100 Гбайт и 10000 модулей кода. Согласно отзывам, выгода от использовании этой системы заключалась в уменьшении размеров кода на 10% благодаря, главным образом, повторному использованию, снижению затрат на поддержку (группа из 12 человек), безотказному вводу в действие и, прежде всего, очень большой гибкости и возможности расширении. Эти пре­имущества не были бесплатными. Разработчикам пришлось изобретать собственные объ­ектно-ориентированные методы разработки и стандарты, поскольку в период с 1987 по 1990 гг. соответствующие спецификации еще не были созданы, а традиционных методов оказалось недостаточно [4, с. 46].

Еще одним примером успешного применения объектно-ориентированной технологии на ранней стадии се развития может послужить система управления техническим обслуживани­ем компании General Motors. Эта система помогала составлять график ремонтных работ н позволяла выполнять инвентаризацию запасных частей. В старой системе содержалось 265 тысяч строк кода на языке PL/1. Эта система разрабатывалась в течение 12,5 человеко-лет и при работе использовала 13.6 Мбайт оперативной памяти. Новая система была разработана на языке Smalltalk 80 менее, чем за один человеко-год и содержала всего лишь 22 тысячи строк кода, а также использовала не более 1.1 Мбайт оперативной памяти. Примечательно то, что рабочие характеристики обеих систем были примерно одинаковы, а общий выигрыш в производительности можно было оценить соотношением 14:1. Конечно, повторно создавать систему почти всегда намного проще, однако это соотношение все равно впечатляет [4, с. 47].

Хотя выше утверждалось, что добиться повторного использовании (но сравнению с воз­можностью расширении) очень трудно, некоторые компании все же смогли реализовать это. Компания Petroleum Information предоставляет географические данные для предприятий нефтяной и газовой промышленности. В этой компании с использованием системы CLOS (системы объектно-ориентированного программирования на языке Common Lisp) была создана геоинформационная система Sorcerer’s Apprentice (т.е. «ученик чародея»), о которой сообщалось, что 80% ее исходного кода используется повторно. Это, в свою очередь, приве­ло к существенному сокращению сроков разработки и попыткам со стороны разработчиков преодолеть те проблемы, которые ранее считались трудноразрешимыми [18, с. 95].

К другим крупномасштабным приложениям относятся многие торговые системы, разра­ботанные для банковской сферы. В начале 1990-х годов в корпорации Swiss Bank использо­вался язык Objective С. Прн этом на протяжении трех лет удалось добиться 50%-го увеличения производительности программистов.

В источнике [4] описывается ряд исследованных конкретных случаев наиболее успешного применении объектной технологии, которые были выдвинуты на конкурс Object World (Мир объектов) в 1992 году. К ним относятся бухгалтерская и административная система компании Southern California Gas, моделирующая программа с применением объектно-ориентирован­ного анализа компании Boeing и набор средств разработки программ для лечебных учрежде­ний.

Позднее традиционные системы были быстро реконструированы с использованием объектно-ориентированного подхода и связанных с ним методов, таких как экстремальное программирование (eXtreme Programming) [20, с. 211].

Для представления всего множества сфер применения ООП рассмотрим, что же может служить объектами:

♦ Физические объекты.

  • Автомобили при моделировании уличного движения.
  • Схемные элементы при моделировании цепи электрического тока.
  • Страны при создании экономической модели.
  • Самолеты при моделировании диспетчерской системы.

♦ Элементы интерфейса.

  • Окна.
  • Меню.
  • Графические объекты (линии, прямоугольники, круги).
  • Мышь, клавиатура, дисковые устройства, принтеры.

♦ Структуры данных.

  • Массивы.
  • Стеки.
  • Связанные списки.
  • Бинарные деревья.

♦ Группы людей.

  • Сотрудники.
  • Студенты.
  • Покупатели.
  • Продавцы.

♦ Хранилища данных.

  • Описи инвентаря.
  • Списки сотрудников.
  • Словари.
  • Географические координаты городов мира.

♦ Пользовательские типы данных.

  • Время.
  • Величины углов.
  • Точки на плоскости.

♦ Участники компьютерных игр.

  • Автомобили в гонках.
  • Позиции в настольных играх (шашки, шахматы).
  • Животные в играх, связанных с живой природой.
  • Друзья и враги в приключенческих играх. [13, с. 83].

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

Однако это совсем не означает, что на этом пути не было многочисленных провалов. Примечательно то, что многие из возникающих трудностей заставляли организации, которые в начале 1990-х годов приняли язык програм­мирования С++ и связанные с ним методы, отказаться от объектной технологии [6, с. 74].

Как показывает накопленный опыт, повторное использование вполне достижимо, однако для этого необходимо гораздо больше, чем просто хороший язык объектно-ориентированного программирования. Для этого требуются соответствующие средства управления проектом, надежные методы и, кроме всего прочего, пристальное внимание к проблемам образования, обучения и управления изменениями, а также немного везения. Тогда можно добиться повторного использования, но только при определенных затратах. Конечно, для написания и тестирования повторно используемого кода требуется несколько больше времени. Однако непосредственные преимущества расширения зачастую оттесняют выгоды от повторного ис­пользования на почетное второе место. Расширяемость является одной из главных характе­ристик систем, востребованных в сфере бизнеса. Таким образом, даже если повторное использование нс приемлемо, от применения обьектно-ориентнрованных методов можно все же получить большой выигрыш.

Несмотря на многочисленные успехи, в настоящее время ситуация все же складывается так, что подавляющее большинство организаций не в состоянии широко воспользоваться преимуществами повторного использования. В основе этого лежат, скорее всего, экономические и административные причины, которые непосредственно не связаны с самой технологией [2, с. 141].

ЗАКЛЮЧЕНИЕ

После процедурного подхода к программированию, следующей ступенью в развитии технологий программирования стало появление ООП — программный код теперь не представляется «плоским», а программисту подвластны не только процедуры и функции, но и целые классы. Разумеется, процесс планирования при использовании ООП упрощается, так как объекты программы соответствуют объектам реального мира.

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

Первые программисты писали программы посредством использования машинных кодов. Впоследствии было создано множество различных языков программирования, например: C, ADA, FoxPro, Fortran, Basic, Pascal и другие. Следующей же ступенью развития стало объектно-ориентированное программирование. Появились соответствующие данной парадигме языки, например: C++, Object Pascal. Наблюдалась борьба между скоростью разработки программного обеспечения и скоростью выполнения программного кода. Наиболее важными событиями, связанными с историей ООП считаются появление языка «Симула», содержащего базовые аспекты ООП, а также возникновение языка Smalltalk — первого объектно-ориентированного языка программирования.

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

Вычисление осуществляется посредством взаимодействия объектов. Программирование превращается в процесс моделирования в какой-либо предметной области. Объект получается в результате инкапсуляции состояния (данных) и поведения (операций). Тем самым объект во многих отношениях аналогичен модулю или абстрактному типу данных.

Поведение объекта диктуется его классом. Каждый объект является экземпляром некоторого класса. Все экземпляры одного класса будут вести себя одинаковым образом (то есть вызывать те же методы) в ответ на одинаковые запросы. Объект проявляет свое поведение путем вызова метода в ответ на сообщение. Интерпретация сообщения (то есть конкретный используемый метод) зависит от объекта и может быть различной для различных классов объектов. Происходит наследование поведения от родительских классов.

Наличие иерархических отношений наследования между абстракциями (классами и интерфейсами), экземплярами которых являются объекты в программе, является отличительной чертой объектно-ориентированного подхода в программировании. Поддержка наследования в объектно-ориентированных языках означает возможность выражения отношения «is a» среди типов. Если язык не поддерживает механизм наследования, то его нельзя считать объектно-ориентированным.

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

Методология объектно-ориентированного анализа и проектирования применяется при разработке объемных (например, корпоративных) информационных систем. Известны такие сферы применения как система управления клиентами, техническим обслуживани­ем компании, торговые, инженерные, геоинформационные системы и др.

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Богуславский А.А., Соколов С.М. Основы программирования на языке Си++: Для студентов физико-математических факультетов педагогических институтов. – Коломна: КГПИ, 2002. – 490 с.
  2. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений, 3-е изд. / Г. Буч и др. // Пер. с англ. – М.: «И.Д. Вильямс», 2010. – 720 с.
  3. Волкова И. А., Иванов А. В., Карпов Л. Е. Основы объектно-ориентированного программирования. Язык программирования С++. Учебное пособие для студентов. — М.: Издательский отдел факультета ВМК МГУ, 2011. - 112 с.
  4. Грэхем И. Объектно-ориентированные методы. Принципы и практика. - М.: Вильямс, 2004. – 800 с.
  5. Кириченко А.А. Объектно-ориентированное программирование на алгоритмическом языке C#. – Сетевое электронное издание учебного пособия; М., Издательство «Высшая школа экономики», 2015. – 215 с.
  6. Кьоу Д. Объектно-ориентированное программирование. - СПб.: Питер, 2005. – 237 с.
  7. Лаптев В.В. С++. Объектно-ориентированное программирование: учебное пособие. - СПб. : Питер, 2008. – 457 с.
  8. Лафоре Р. Объектно-ориентированное программирование в C++ / Р. Лафоре. — 4-е изд. — СПб.: Питер, 2004. — 928 с.
  9. Лясин Д.Н., Саньков С.Г. Объектно-ориентированное программирование на языке С++: Учебное пособие./ Волгоград.гос.техн.ун-т,- Волгоград, 2003. – 83 с.
  10. Медведев В. И. Особенности объектно-ориентированного программирования на C++/CLI, C# и Java. / В. И. Медведев. — 2-е изд., испр. и доп. — Казань: РИЦ «Школа», 2010. — 444 c.
  11. Мухортов В. В., Рылов В.Ю. Объектно-ориентированное программирование, анализ и дизайн. Методическое пособие. Новосибирск: ООО «Новософт», 2002. – 180 с.
  12. Павловская Т.А. С/С++ Программирование на языке высокого уровня. – СПБ.: Питер, 2009. – 461 с.
  13. Пышкин Е.В. Основные концепции и механизмы ООП. - СПб.; БХВ - Петербург, 2005 – 640 с.
  14. Радченко Г.И. Объектно-ориентированное программирование / Г.И. Радченко, Е.А. Захаров. - Челябинск: Издательский центр ЮУрГУ, 2013. - 167 с.
  15. Романенко В. В. Объектно-ориентированное программирование: Учебное пособие / Романенко В. В. – 2014. - 475 с.
  16. Романов С.С. Ключевые понятия и особенности объектно-ориентированного программирования // Таврический научный обозреватель. - 2016. - №12-2 (17). - С.141-146.
  17. Страуструп Б. Язык программирования С++. Специальное издание. Пер. с англ. / Б. Страуструп // СПб., М.: «Невский диалект» – «Издательство БИНОМ», 2008 г. – 1104 с.
  18. Уймин А. Г. Кыштымов М. А. Применение объектно-ориентированного программирования для разработки геоинформационных систем // Перспективы развития информационных технологий. – 2012. - № 8. – С.94-98.
  19. Фленов М. Е. Библия Delphi / М. Е. Фленов. — 3-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2011. — 688 с.
  20. Хорев П.Б. Технологии объектно-ориентированного программирования. – М.: Академия, 2008. – 448 с.
  21. Бертран М. Основы объектно-ориентированного программирования [Электронный ресурс] / Бертран М. — Электронное издательство «Интернет-университет информационных технологий — ИНТУИТ.ру», 2005. URL: http://www.intuit.ru. (Дата обращения: 10.09.2017).
  22. Курс лекций «Основы информатики и программирования». Электронное издательство «Интернет-университет информационных технологий — ИНТУИТ.ру». URL: http://www.intuit.ru. (Дата обращения: 10.09.2017).
  23. Программирование. ООП в Pascal. URL: http://www.pascal.helpov.net/index/object-oriented_programming_pascal_ programming#pascal-oop_8. (Дата обращения: 10.09.2017).
  24. Руководство пользователя. Borland Pascal. Глава 9. Объектно-ориентированное программирование. URL: http://citforum.ru/programming/bp70_ug/bp70ug_09.shtml. (Дата обращения: 10.09.2017).
  25. Ямов С.И., Кабак И.С Актуальность и перспективы использования объектно-ориентированного подхода при проектировании сложных гибких систем управления. URL: http://magazine.stankin.ru/arch/n_02/automation/art12.html. (Дата обращения: 10.09.2017).