Файл: История и развитие методологии объектно-ориентированного программирования. Сферы применения (Исторические аспекты развития языков программирования).pdf
Добавлен: 29.02.2024
Просмотров: 88
Скачиваний: 0
СОДЕРЖАНИЕ
1. Исторические аспекты развития языков программирования
1.1. История развития представлений о программировании и формирования объектной модели
1.2. Краткая история методологий программирования
Методология машинного кодирования
Методология процедурного программирования
Методология логического программирования
Методология функционального программирования
Методология структурного программирования
Методология объектно-ориентированного программирования
2. Развитие объектно-ориентированной методологии программирования
2.1. Концептуальная база объектно-ориентированной методологии
2.2. Понятие объектно-ориентированного программирования
2.3. Виды объектно-ориентированных языков программирования
Достоинства методологии объектно-ориентированного программирования
Недостатки методологии объектно-ориентированного программирования
Для разрешения данных противоречий использовались принципы объединения, вынесения, предварительного действия, что послужило толчком к возникновению новых методологий программирования – процедурной, логической и функциональной. [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
Объектно-ориентированный подход, лежащий в основе объектно-ориентированной методологии программирования, принципиально отличается от подходов, которые связаны с методами структурного анализа, проектирования и программирования, и в свое время был воспринят разработчиками как «панацея» благодаря своим явным преимуществам по сравнению с другими подходами:
- объектная декомпозиция позволяет создавать программные системы меньшего размера путем использования общих механизмов, которые обеспечивают необходимую экономию выразительных средств.
- объектная декомпозиция упрощает процесс создания сложных систем программного обеспечения, представляющих собой набор некоторых подсистем.
- процесс интеграции программной системы происходит параллельно с процессом разработки, а не превращается в единовременное событие.
Поскольку структура программного обеспечения, реализованного при помощи объектно-ориентированного подхода, отражает реальный или воображаемый мир, он позволяет размышлять о задаче в терминах, существующих в этом мире объектов, а не в терминах языка программирования.
К тому же основные операции, заложенные в программное обеспечение, имеют тенденцию изменяться намного медленнее, чем информационные потребности определенных групп пользователей или организаций. Это означает, что программное обеспечение, основанное на общих моделях, будет существовать и успешно работать много дольше, чем то, которое написано для решения определенной, сиюминутной проблемы.
В настоящее время объектно-ориентированная методология программированию используется в подавляющем большинстве промышленных проектов.
2. Развитие объектно-ориентированной методологии
программирования
2.1. Концептуальная база объектно-ориентированной методологии
Любая методология программирования имеет под собой концептуальную базу и требует определенного способа восприятия решаемой задачи. Для объектно-ориентированной методологии концептуальной базой является объектная модель, которая опирается на четыре основных принципах: абстрагирование, инкапсуляция, полиморфизм и наследование. [3]
Основные принципы объектно-ориентированного подхода:
- Абстрагирование предполагает выделение существенных характеристик некоторого объекта, которые отличают его от других видов объектов. Абстрагирование фокусирует внимание на внешнем представлении объекта и тем самым позволяет разделить существенные особенности поведения от их реализации. Абельсон и Суссман определили такое отделение поведения объекта от его реализации как принцип минимальных обязательств, согласно которому интерфейс объекта должен обеспечивать только основные аспекты его поведения и больше ничего. Наряду с этим выделяют еще один дополнительный принцип наименьшего удивления, заключающийся в том, что абстракция должна полностью описывать поведение объекта и не порождать побочные эффекты, выходящие за пределы абстракции. [2, 8, 9]
- Инкапсуляция заключается в отделении друг от друга элементов объекта, которые определяют его строение и поведение. С помощью инкапсуляции можно изолировать контрактные обязательства абстракции от их реализации. Абстрагирование и инкапсуляция дополняют друг друга. Абстракция концентрирует внимание на наблюдаемом поведении объекта, а инкапсуляция – на реализации, которая обеспечивает заданное поведение объекта. Обычно, инкапсуляция реализуется за счет сокрытия информации о всех несущественных деталях объекта. Как правило, скрываются структура объекта и реализация его методов. [2, 9]
- Полиморфизм заключается в обозначении различных действий одним именем и способности объекта отвечать на обращенный к нему запрос в соответствии со своим типом. Полиморфизм позволяет избежать использования операторов выбора, при этом связь метода и имени определяется только на стадии выполнения программ. [2, 13]
- Наследование позволяет определять новые типы данных, используя уже существующие, при этом данные и функции существующих классов становятся членами наследуемых классов. [2, 9]