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

История и развитие методологии объектно-ориентированного программирования. Сферы применения (Исторические аспекты развития языков программирования)

Содержание:

ВВЕДЕНИЕ

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

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

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

Предмет курсовой работы: исторические аспекты развития методологии объектно-ориентированного программирования.

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

Для достижения поставленной цели необходимо решить ряд задач:

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

1. Исторические аспекты развития языков программирования

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

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

С момента создания первых ЭВМ подходы к разработке программного обеспечения прошли длинный и сложный путь. Безусловно, современное программное обеспечение на порядок масштабнее и сложнее своих предшественников. Именно возрастание сложности программного обеспечения стимулировало многочисленные прикладные исследования по методологии проектирования программного обеспечения, особенно в области декомпозиции, абстракции и иерархии. Таким образом, появилась тенденция перехода от языков программирования, которые бы указывали компьютеру, что делать, к языкам, которые описывали ключевые абстракции проблемной области и связи между ними. [6]

Рис. 1. Классификация П. Вегнера

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

Языки программирования I поколения (1954 – 1958 гг.) применялись в научно-инженерной предметной области, словарь которой был практически полностью математическим. [6]

Рис. 2. Топология языков I поколения

Языки программирования II поколения (1959 – 1961 гг.) характеризовались развитием алгоритмических абстракций. В данный период мощность компьютеров достаточно быстро увеличивалась, что позволило расширить области их применения. Характерными особенностями языков программирования данного поколения являлись: задание типов данных, использование подпрограмм и указателей, раздельная компиляция, работа со списками, сборка мусора. [6]

Именно начиная с середины 1960-х годов подпрограммы стали важным промежуточным звеном между компьютером и решаемой задачей (рис. 3). Подпрограммы как механизм абстрагирования привели к существенным последствиям:

Рис. 3. Топология языков II поколения

  1. были разработаны языки программирования, которые поддерживают разнообразные механизмы передачи параметров;
  2. были заложены основы структурного программирования: языковая поддержка механизмов вложенности подпрограмм, научное исследование структур управления и областей видимости;
  3. появились методы структурного проектирования, позволяющие разрабатывать большие системы с использованием подпрограмм как готовых строительных блоков. [6]

В конце 1960-х годов в связи с появлением транзисторов, а позднее и интегральных схем, стоимость компьютеров существенно снизилась, а их производительность экспоненциально увеличилась. Развитие методологий программирования позволило существенно ускорить и облегчить разработку программного обеспечения, но при этом не успевало за растущими высокими темпами потребностями в программных средствах. Однако ни гибкость структурного метода, ни масштабы его использования не позволили существенно ускорить процесс программирования. Также возникла потребность в упрощении сопровождения и модификации разработанных программных средств. Необходимо было кардинально изменить способ построения программных систем таким образом, чтобы локальные изменения не могли нарушать работоспособность всей системы, и было легче модифицировать поведения системы. Далеко не все задачи поддавались алгоритмическому описанию и тем более алгоритмической декомпозиции. Требовалось приблизить структуру программ к структуре решаемых задач. [6]

В результате появились языки программирования III поколения (1962 – 1970 гг.) с поддержкой абстракции данных. У программистов появилась возможность создания пользовательских типов данных (рис. 4). Дейкстра одним из первых обратил внимание на важность построения программных систем в виде многоуровневых абстракций. Позднее Парнас ввел инкапсуляцию – сокрытие информации. [6]

Рис. 4. Топология языков III поколения

В 1970-х годах ряд исследователей (Лисков, Гуттаг, Шоу) разработали механизмы абстрактных типов данных, Хоар дополнил эти подходы теорией подклассов (рис. 5). Технологии построения баз данных также внесли свой вклад в разработку объектной модели, в модели, предложенной Ченом, моделирование происходит в терминах сущностей, их атрибутов и взаимоотношений. Свой вклад в развитие объектно-ориентированных абстракций внесли и исследователи в области искусственного интеллекта, разрабатывавшие методы представления знаний. Объектная модель получила широкое распространение лишь в конце 1980-х и начале 1990-х годов. [13]

Рис. 5. Топология языков IV поколения

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

Для более глубокого понимания факторов и причин возникновения объектно-ориентированной методологии программирования рассмотрим эволюцию методологий программирования. [7]

1.2. Краткая история методологий программирования

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

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

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

Задача программирования – обеспечение взаимодействия компьютера и человека.

Концепция программирования является движущей силой для возникновения новой группы языков программирования.

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

Парадигма – это устоявшаяся система научных взглядов, в рамках которой осуществляются исследования. [10]

Парадигма программирования (методология программирования) – это совокупность идей и понятий, которые сформулированы на основе концепции программирования и определяют стиль программирования.

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

Для более наглядного представления эволюции методологий программирования опишем их в виде формализованного макета (рис. 6). [8]

Рис. 6. Макет описания методологии программирования

Методология машинного кодирования

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

Рис. 7. Методология машинного кодирования

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

Увеличении сложности задачи программирования влечет недопустимое:

  • увеличение машинного кода;
  • усложнение структуры процессора;
  • увеличение времени программирования.

Для разрешения обозначенных противоречий необходимо использовать принципы копирования и объединения. Таким образом, произошел переход к новой методологии программирования – ассемблированию. [6, 14, 18]

Методология ассемблирования

Выявленные в методологии машинного кодирования противоречия устраняются за счет следующих решений:

  • используя принцип копирования, заменяется понятие адреса ячеек и их значения понятием «операнд»;
  • используя принцип объединения, объединяются однородные машинные инструкции в мнемонические команды.

В итоге возникла новая методология программирования – ассемблирование (рис. 8) – методология, в которой осуществляется компиляция исходного текста программы на языке Ассемблер, в программу на машинном языке. Обращение к процессору выполняется через мнемонические команды, соответствующие инструкциям процессора вычислительной системы. [16]

Рис. 8. Методология «Ассемблирование»

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

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

Для разрешения данных противоречий использовались принципы объединения, вынесения, предварительного действия, что послужило толчком к возникновению новых методологий программирования – процедурной, логической и функциональной. [6, 16, 18]

Методология процедурного программирования

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

Возник новый механизм написания программного кода – замена машинного кода императивом.

Процедурное программирование (рис. 9) представляет программирование на императивном языке, при котором последовательно выполняемые операторы можно консолидировать в более крупные целостные единицы – подпрограммы.

Рис. 9. Методология процедурного программирования

Императивный язык программирования представляет собой язык, описывающий процесс вычисления в виде инструкций, которые изменяют состояние программы. Императивная программа – это последовательность команд для компьютера. [15]

Еще одним нововведением явилось использование в программном коде сложных задач императивов – ассоциативных слов(input, print, next и т.п.). В связи с этим возникли новые противоречия:

  • механизм безусловного перехода к определенной точке программы привел к увеличению неструктурированных программных конструкций, и как следствие существенно увеличилось время компиляции программы;
  • увеличение количества безусловных переходов существенно уменьшил взаимозависимость фрагментов программного кода. [11]

Для разрешения обозначенных противоречий использовали принцип предварительного действия, что привело к появлению методологии структурного программирования. [6, 15]

Методология логического программирования

Выявленные ранее противоречия устраняются за счет введения следующих принципов:

  • вынесения: произошел отказ от управляющих операторов и операторов присваивания;
  • предварительного действия: программа стала представляться в виде высказываний в символьной логике.

В результате возникли новые механизмы логической методологии программирования: программное вычисление предикатов и автоматическое доказательство теорем. Логическое программирование основано на теории и аппарате математической логики с использованием математических принципов (рис. 10). [10]

Рис. 10. Методология логического программирования

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

Указанное противоречие удалось разрешить в связи с эволюцией методологий и возникновением объектно-ориентированной методологии программирования. [6, 15, 16]

Методология функционального программирования

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

Возник новый механизм – модель вычислений без состояний, заключающийся в том, что программа ни целиком, ни частями состояния не имеет и побочных эффектов не производит.

При функциональном программировании процесс вычисления понимается как вычисление значений функций в математическом толковании (рис. 11). [6]

Рис. 11. Методология функционального программирования

Функциональное программирование предполагает обходиться вычислением результатов функций от исходных данных и результатов других функций, и не предполагает явного хранения состояния программы. Соответственно, не предполагает оно и изменяемость этого состояния. [18]

Функциональный язык не подразумевает сравнений в условиях, так как в таком языке отсутствует понятие переменной и понятие присваивания.

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

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

Методология структурного программирования

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

Возник новый механизм структурного программирования – представления программного кода в виде иерархической структуры блоков с помощью логических операторов (рис. 12). [6, 16]

Следование принципам структурного программирования сделало тексты программ более читабельными. Серьёзно облегчилось понимание программы не только ее автором, но и другими программистами. Отказ от безусловного перехода позволил повысить структурированность программного кода. [5]

Рис. 12. Методология структурного программирования

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

Данное противоречие удалось разрешить только с возникновением объектно-ориентированной методологии. [6, 16, 18]

Методология объектно-ориентированного программирования

Рассмотрим конкретные решения, помогающие устранить противоречия структурной, логической и функциональной методологий программирования:

  • принцип местного качества позволили перейти от однородной структуры кода к неоднородной, для чего объединили однородные части кода;
  • принцип объединения соединил абстрактные типы данных в классы, а экземпляры классов в объекты;
  • принцип универсальности сделал возможным использование одинаковых функций для разных объектов за счет наследования свойств одного класса у другого;
  • принцип «матрешки» позволили ввести понятия родительского и наследного классов, при этом наследный класс стал динамически связан с родительским, свойства класса-родителя стали переходить и на класс-наследник. [2, 6, 8]

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

Объектно-ориентированное программирование – это методология программирования, в которой основными концепциями являются понятия объектов и классов (рис. 13).

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

Отказ от использования однотипных конструкций структурных языков привел к введению визуально легких конструкций. Например, операторы { } заменили аналогичными операторами начала и конца функции begin и end, синтаксис условных конструкций сократился до использования лишь if (условие) и else, наконец, стало возможным записывать условие одной строкой, не нарушая при этом логики программы. Как следствие, получили более высокую организацию кода.

Таким образом, место объектно-ориентированной парадигмы в системе языков программирования показано на рис. 14. [2, 6, 8]

Рис. 14. Эволюционная карта парадигм программирования

Вывод по главе 1

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

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

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

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

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

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

2.1. Концептуальная база объектно-ориентированной методологии

Любая методология программирования имеет под собой концептуальную базу и требует определенного способа восприятия решаемой задачи. Для объектно-ориентированной методологии концептуальной базой является объектная модель, которая опирается на четыре основных принципах: абстрагирование, инкапсуляция, полиморфизм и наследование. [3]

Основные принципы объектно-ориентированного подхода:

  1. Абстрагирование предполагает выделение существенных характеристик некоторого объекта, которые отличают его от других видов объектов. Абстрагирование фокусирует внимание на внешнем представлении объекта и тем самым позволяет разделить существенные особенности поведения от их реализации. Абельсон и Суссман определили такое отделение поведения объекта от его реализации как принцип минимальных обязательств, согласно которому интерфейс объекта должен обеспечивать только основные аспекты его поведения и больше ничего. Наряду с этим выделяют еще один дополнительный принцип наименьшего удивления, заключающийся в том, что абстракция должна полностью описывать поведение объекта и не порождать побочные эффекты, выходящие за пределы абстракции. [2, 8, 9]
  2. Инкапсуляция заключается в отделении друг от друга элементов объекта, которые определяют его строение и поведение. С помощью инкапсуляции можно изолировать контрактные обязательства абстракции от их реализации. Абстрагирование и инкапсуляция дополняют друг друга. Абстракция концентрирует внимание на наблюдаемом поведении объекта, а инкапсуляция – на реализации, которая обеспечивает заданное поведение объекта. Обычно, инкапсуляция реализуется за счет сокрытия информации о всех несущественных деталях объекта. Как правило, скрываются структура объекта и реализация его методов. [2, 9]
  3. Полиморфизм заключается в обозначении различных действий одним именем и способности объекта отвечать на обращенный к нему запрос в соответствии со своим типом. Полиморфизм позволяет избежать использования операторов выбора, при этом связь метода и имени определяется только на стадии выполнения программ. [2, 13]
  4. Наследование позволяет определять новые типы данных, используя уже существующие, при этом данные и функции существующих классов становятся членами наследуемых классов. [2, 9]

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

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

  1. Модульность является свойством системы, разложенной на модули, внутренне связанные между собой. Правильный выбор модулей в процессе решения определенной задачи – это сложная подзадача, сопоставимая с выбором правильного набора абстракций. Разработан ряд эмпирических приемов и правил, которые позволяют обеспечить разумную модульность. Бриттон и Парнас считают, что конечная цель декомпозиции программы на модули – это снижение затрат на программирование за счет независимого проектирования и тестирования. В конечном итоге структура каждого модуля должна быть достаточно проста для понимания, предполагать независимую реализацию других модулей и не влиять на их поведение, позволять производить достаточно легкое изменение проектных решений. [9, 13]
  2. Типизация определяет правила использования объектов, которые не допускают и не ограничивают взаимную замену объектов разных классов. Типизация заставляет проектировщиков выражать свои абстракции таким образом, чтобы используемый для реализации программной системы язык поддерживал принятые проектные решения.
  3. Параллелизм заключается в предоставлении возможности различным объектам одновременного действия.
  4. Устойчивость предполагает способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства. [9, 13]

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

Алан Кей [1], создатель объектно-ориентированного языка Smalltalk, выделяет следующие ключевые положения объектно-ориентированной парадигмы:

  1. все является объектом;
  2. вычисления реализуются через обмен данными между объектами, при котором один объект требует выполнение некоторого действия от другого объекта. Взаимодействие объектов осуществляется по средствам обмена сообщениями, которые представляют собой запрос на выполнение некоторого действия, дополненного набором необходимых аргументов;
  3. каждый из объектов обладает независимой памятью, состоящей из других объектов;
  4. каждый объект является экземпляром (представителем) класса, выражающим общие свойства объектов;
  5. функциональность (поведение) объекта задается в классе, поэтому все объекты, являющиеся экземплярами одного класса, могут выполнять один и тот же набор действий;
  6. все классы организованы в единую иерархию наследования, поэтому память и поведение, определяемое экземплярами определённого класса, автоматически доступны любому классу, который расположен ниже в иерархии. [1]

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

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

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

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

Ренч однажды предсказал: «В 1980-х годах объектно-ориентированное программирование будет занимать такое же место, какое занимало структурное программирование в 1970-х. Оно всем будет нравиться. Каждая фирма будет рекламировать свой продукт как созданный по этой технологии. Все программисты будут писать в этом стиле, причем все по-разному. Все менеджеры будут рассуждать о нем. И никто не будет знать, что же это такое». [3]

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

Г. Буч, главный исследователь корпорации Rational Software, дает следующее определение: «Объектно-ориентированное программирование – это метод реализации, в котором программы организуются в виде взаимодействующих наборов объектов, каждый из которых представляет собой экземпляр класса, а классы являются членами иерархии, связанной отношением наследования». [3]

Согласно этому определению не все языки программирования относятся к объектно-ориентированным. Б. Страуструп, создатель языка С++, утверждает: «Если написание программ в стиле объектно-ориентированного программирования требует специальных усилий или оно невозможно совсем, то этот язык не отвечает требованиям объектно-ориентированного программирования». [17]

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

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

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

2.3. Виды объектно-ориентированных языков программирования

Язык Simula (1967 г.) считается общим предком большинства современных объектных и объектно-ориентированных языков. Язык Simula дополнил идеи языка ALGOL концепциями наследования и инкапсуляции. Simula привнес такие идеи, как: объекты, классы, виртуальные методы.

Новый взгляд на программирование, отличный от процедурного, предложили А. Кэй и Д. Ингаллс в языке Smalltalk (198 г.), в котором «класс» и «объект» стали основой для остальных конструкций языка. Именно Smalltalk считается первым широко известным объектно-ориентированным языком программирования, используемым для проектирования сложных графических интерфейсов. [2, 8]

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

Наиболее известными объектно-ориентированными языками программирования являются: Simula-67 (1967 г.); Smalltalk (1980 г.); C++ (1983 г.); Eiffel (1986 г.); Python (1990 г.); Java (1995 г.); Delphi (1995 г.); Perl 6 (2000 г.); C# (2001 г.); Scala (2003 г.). На рис. 15 изображена генеалогия наиболее популярных объектно-ориентированных языков программирования, в которой стрелками показано влияние одних языков на другие. [2, 13]

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

Классификация по используемым моделям программирования:

  • «Чистые» языки, использующие только одну модель программирования – объектно-ориентированную (например, Eiffel, Smalltalk).
  • «Гибридные» языки, использующие при необходимости возможности нескольких парадигм программирования (например, C++, Delphi).
  • «Урезанные» языки, появившиеся в результате удаления из гибридных языков наиболее опасных и ненужных с объектно-ориентированной точки зрения конструкций (например, Java, C#). [2, 9]

Рис. 15. Генеалогическая зависимость языков объектно-ориентированной
методологии

В работе Саундерса приводится обзор более 80 объектно-ориентированных языков, сгруппированных в 7 категорий (рис. 16). [3]

Рис. 16. Категории объектно-ориентированных языков по Саундерсу.

Классификация по основным механизмам исполнения языков программирования:

1) по принципу преобразования кода в программу:

  • интерпретируемые языки;
  • компилируемые языки;

2) по характеру типизации:

  • языки со слабой типизацией;
  • языки со строгой типизацией.

Из-за обилия языков программирования и их диалектов, которых в общей сложности насчитывается более 2500, и критериев классификации разработчику программных систем сложно объективно оценивать эффективность использования какого-либо языка программирования для решения поставленных задач, поэтому чаще всего выбор языка обоснован субъективными причинами, и как следствие – к нерациональному использованию одних языков и игнорированию других. В итоге программисты пишут менее эффективные и менее изящные программы, чем могли бы. [2, 8, 9]

Вывод по главе 2

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

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

В настоящее время известно более 2500 объектно-ориентированных языков программирования, наиболее известные из них: Simula, Smalltalk, C++, Python, Java, Delphi, Perl, C и т.д.

3. Сферы применения объектно-ориентированного программирования

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

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

  • Возможность абстрагирования от деталей реализации за счет использования классов, позволяющих осуществлять конструирование из полезных компонентов, имеющих простые инструменты.
  • Повышение наглядности и удобства сопровождения программного обеспечения за счет локализация программного кода и данных, образующих определенную сущность.
  • Модульность (за счет использования инкапсуляции), позволяющая реализовывать распараллеливание выполнения задачи между исполнителями и обновление версий отдельных компонентов.
  • Расширяемость программной системы за счет использования новых компонентов без внесения в нее каких-либо изменений. Компоненты могут быть добавлены на этапе исполнения программы.
  • Возможность обработки разнородных структур данных. Программный код упрощается за счет того, что программы могут работать, не различая вида объектов, причем новые виды объектов могут добавляться в любой момент.
  • Возможность изменения поведения объекта на этапе исполнения: один объект может быть заменен на другой, поэтому можно адаптировать алгоритм даже без изменения кода.
  • Возможность обобщения алгоритмов (за счет наследования) на несколько видов объектов. [2, 13]
  • Возможность создания набора универсальных классов, независимых от предметной области, и расширяемых под специфику конкретного приложения.
  • Многократное использование компонентов, позволяющее сократить время разработки программы и число допускаемых ошибок, а также упрощающее структуру и пользовательский интерфейс программной системы. [2, 8]

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

  • Документирование классов является более трудной задачей, нежели документирование процедур и модулей. Поскольку любой метод может быть переопределен, в документации нужно указывать не только то, что делает данный метод, но и то, в каком контексте он вызывается. Следовательно, разработчик программного обеспечения должен знать, какие условия выполняются, когда вызывается данный метод.
  • В сложных иерархиях классов поля и методы обычно наследуются с разных уровней, поэтому не всегда просто определить, какие поля и методы фактически относятся к данному классу. Для получения такой информации нужны специальные инструменты, например, навигатор классов. Если конкретный класс расширяется, то каждый метод обычно сокращают перед передачей сообщения базовому классу. Реализация операции, таким образом, рассредотачивается по нескольким классам, и чтобы понять, как она работает, необходимо просматривать весь код. [2, 9]
  • Методы, как правило, короче процедур, поскольку они осуществляют только одну операцию над данными, зато их намного больше. В коротких методах легче разобраться, но они неудобны тем, что код для обработки сообщения иногда распределен по многим маленьким методам.
  • Существует мнение, что объектно-ориентированное программирование является неэффективным. Рассмотрим различные виды неэффективности:
  1. Неэффективность на этапе выполнения. В языках типа Smalltalk сообщения интерпретируются во время выполнения программы путем осуществления их поиска в одной или нескольких таблицах и за счет выбора подходящего метода – это медленный процесс. В гибридных объектно-ориентированных языках отправка сообщения приводит лишь к вызову через указатель процедурной переменной. И поскольку сообщения встречаются в программе гораздо реже других операций, их воздействие на время выполнения влияния практически не оказывает. Еще одним фактором, влияющим на время выполнения является инкапсуляция данных. Рекомендуется выполнять каждую операцию над данными через методы, а не предоставлять прямой доступ к полям класса. Однако если инкапсуляцию использовать только там, где она действительно необходима, то замедление вполне приемлемое. [9]
  2. Неэффективность в смысле распределения памяти. Динамическое связывание и проверка типа на этапе выполнения требуют по ходу работы информацию о типе объекта. Такая информация хранится в дескрипторе типа и он выделяется один на класс. Каждый объект имеет невидимый указатель на дескриптор типа для своего класса. Поэтому в объектно-ориентированных программах необходимая дополнительная память выражается в одном указателе для объекта и в одном дескрипторе типа для класса. [9, 13]
  3. Неэффективность, связанная с излишней универсальностью (избыточными возможностями). Зачастую в библиотечном классе содержится методов больше, чем это необходимо, что в конечном итоге увеличивает размер программного кода. Решения данной проблемы: строить базовый класс с минимальным числом методов, а дальше реализовывать различные расширения этого класса, позволяющие расширить функциональность. Другой вариант решения: позволить компоновщику удалять лишние методы. [12]

Исходя из выделенных преимуществ и вместе с тем недостатков методологии объектно-ориентированного программирования обозначим основные сферы применения данной методологии (рис. 17).

Рис. 17 Сферы применения объектно-ориентированного программирования

Вывод по главе 3

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

ЗАКЛЮЧЕНИЕ

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

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

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

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

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

В настоящее время известно более 2500 объектно-ориентированных языков программирования, наиболее известные из них: Simula, Smalltalk, C++, Python, Java, Delphi, Perl, C и т.д.

Сферы применения методологии объектно-ориентированного программирования достаточно широки:

  • разработка серверной части программного обеспечения;
  • разработка клиентской (пользовательской) части программного обеспечения;
  • разработка WEB-приложений;
  • разработка WINDOWS-приложений;
  • разработка приложений к системам управления базами данных;
  • разработка развлекательных приложений (например, игр и т.п.);
  • создание графических модулей;
  • разработка модулей библиотек;
  • создание модулей библиотек.

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

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

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

  1. Бадд Т. Объектно-ориентированное программирование в действии / Т. Бадд – СПб.: Питер, 1997. – 464 с.
  2. Бобровский С. История объектно-ориентированного программирования / С. Бобровский // PC Week/RE. – 2003. – № 28. – С. 19-23.
  3. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений, 3-е изд. / Г. Буч и др. // Пер. с англ. – М.: «И.Д. Вильямс», 2010. – 720 с.
  4. Вегнер П. Программирование на языке Ада / П. Вегнер ; пер. с англ. Ю.Ю. Галимова, Э.М. Киуру – М. : Мир, 1983. – 239 с.
  5. Габриелли М. Языки программирования: принципы и парадигмы / М. Габриелли, С. Мартини. – М. : Лондон Лимитед, 2010. – 450 с.
  6. Голицына О.Л., Партыка Т.Л., Попов И.И. Языки программирования Учебное пособие. – М.: Форум, 2011. – 400 с.
  7. Забудский Е.И. Объектно-ориентированный анализ и программирование на языке C# – М.: Кафедра ОИиППО ГУ-ВШЭ, 2012. – 705 с.
  8. Иванова Г.С. Объектно-ориентированное программирование: Учеб. для вузов/ Под ред. Г.С. Ивановой. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2011. – 320 с.
  9. Кирютенко Ю.А., Савельев В.А. Объектно-ориентированное программирование. Язык Smalltalk / Ю.А. Кирютенко, В.А. Савельев. – М.: Вузовская книга, 2006. – 328 с.
  10. Кун Т. Структура научной революции / Т. Кун. – 3-е изд. – М.: Юниверсити Чикаго Пресс, 2001. – 346 с.
  11. Лайтфут Д. Модульные языки программирования: 7-я конференция Модулярных языков / Д. Лайтфут. – М.: Лондон-Лимитед, 2010. – 30 с.
  12. Лекция 2: Основы объектно-ориентированного программирования. [Электронный ресурс]. URL: https://www.intuit.ru/studies/courses/16/16/lecture/ 27107?page=5 (дата обращения: 05.10.2018).
  13. Мейер Б. Объектно-ориентированное конструирование программных систем / Б. Мейер. – М.: Интернет-университет информационных технологий. – ИНТУИТ.ру", 2005. – 1232 c.
  14. Могилев А.В., Листрова Л.В. Методы программирования. Компьютерные вычисления. – СПб.: БХВ-Петербург, 2013. – 320 с.
  15. Пратт М. Языки программирования / М. Пратт, Б. Зелковитц. – 4-е изд. – М.: Питер, 2005. – 212 с.
  16. Себеста Р. Основные концепции языков программирования / Р. Себеста. – М.: Вильямс, 2001. – 659 с.
  17. Страуструп Б. Дизайн и эволюция С++ / Б. Страуструп. – СПб.: ДМК Пресс, 2006. – 445 с.
  18. Фридман П. Основы языков программирования / П. Фридман. – М.: МИТ, 2008 – 42 с.