- •Основы алгоритмизации и языков программирования
- •0. Введение
- •1. Понятие алгоритма и программы. Свойства алгоритма.
- •3. Этапы разработки программы
- •4.1 Язык записи конечного алгоритма и язык разработки алгоритма
- •5. Классификация языков программирования
- •Краткая история языков программирования
- •6.1. Восходящий подход
- •6.3 Объектно-ориентированный подход
- •7. Данные
- •7.2 Понятие типа объекта в программе. Концепция типа данных
6.3 Объектно-ориентированный подход
По сути это восходящий подход к разработке программ (см. выше).
Ранее уже говорилось, что в рамках процедурного подхода алгоритм имеет дело не с объектами предметной области а с их моделями - данными. При этом данные хранят информацию о конкретных физических параметров объектов, а информация о поведении объектов в окружающем мире, взаимодействие их друг с другом переносится в подпрограммы. В результате целостное представление об объектах предметной области теряется.
В чистом ООП программа уже рассматривается не как реализация алгоритма, ООП основывается на подходе к разработке программ как набора взаимодействующих объектов, передающих друг другу сообщения. При ОО разработке на основании анализа задачи определяется какие объекты предметной области характерны для решаемой задачи и в каких отношениях (использование, обобщение, целое-часть) они находятся. После этого определяются (разрабатываются) программные классы (как обобщенные типы), которые представляют в программе модели объектов предметной области. Объекты в программы - это экземпляры классов (класс как обобщение типа данных). В классах (и объектах классов) связываются в единое целое физические свойства и поведения объектов предметной области , т.е. объекты интегрируют (объединяют) в себе структуры данных и операции (подпрограммы), необходимые для выработки решения. Данное явление называется инкапсуляция.
Постановка задачи
О2
О3
О1
объекты взаимодействие
предметной объектов
области
Схема программы
Процедурный подход О-О подход
Действия3
Данные3
Действия2
Данные2
Данные1
Действия3
Действия2
Действия1
Данные1
Действия1
Данные2
Данные3
программные объекты
(объединяют данные
данные и действия и действия)
не связаны
(оторваны друг от друга)
Другим свойством ООП является наследование - производные классы (потомки) могут наследовать свойства и поведение классов-родителей.
Третьим свойством ООП является полиморфизм (многообразие) - при обозначении общего для всей иерархии действия одним именем (функций) каждый класс в этой иерархии реализует это действие своим собственным пригодным для него способом. Например, в иерархии животных из базового типа "животные" могут быть порождены типы: "сухопутные" (имеют ноги), "водные" (имеют плавники) и "птицы "(имеют крылья). Все типы в этой иерархии могут выполнять базовую операцию "передвижение", но каждый из производных типов выполняет это действие своим способом: 1) сухопутные бегают; 2) рыбы плавают; 3) птицы летают;
6.4 Функциональный подход.
В этом подходе базовом является понятие функции, а основным способом объединения простых конструкций сложной программы, т.е. основным методом программирования является суперпозиция функций.
Так, если надо вычислить
Длина :=
то записывают (вместо присваивания) функцию вида:
Длина (X,Y) = sqrt(X*X+Y*Y)
Эту функцию при функциональном подходе (ФП) можно представить в виде суперпозиции более простых функций (сложить, квадрат и корень):
корень(х,у)=sqrt(x,y)
сложить(x,y)=x+y
квадрат (X)=умножить(X,X)
В итоге получается:
Длина = корень (сложить (умножить(X,X), умножить(Y,Y)));
Видно, что суперпозиция функций в ФП играет ту же роль что и последовательность операторов в языках программирования ориентированных на процедурный подход.
В функциональных программах используются как примитивные функции(ЭВМ или транслятор знают, как их вычислять), так и составные (заранее неизвестное ЭВМ функции, определенная программистом в виде суперпозиции примитивных и заранее определенных функций).
Определение составной функции состоит из левой и правой частей. В левой части указывается присваиваемое функции имя и список ее аргументов (формальных параметров). В правой части определения с помощью суперпозиции описывается, как вычислить значение определяемой функции, если известны ее аргументы.
Выполнение функциональной программы сводится к последовательности замен примитивных и составных функций, каждая постепенно упрощает исходную суперпозицию функций до одного значения результата. На каждом шаге заменяется одна из функций, аргументы которой известны (известные аргументы функции называются фактическими параметрами):
-примитивная функция заменяется на ее значение, которое определяется в результате вызова функции;
- вместо составной функции с известными аргументами в точку ее вызова подставляется суперпозиция функций из правой части определения заменяемой составной функции.
Рассмотрим процесс выполнения функции Длина(), определенной выше. Пусть вызов этой функции (программы ) имеет вид: Длина (4,3).
Поскольку длина - составная функция, то в точку ее вызова будет подставлено (или другими словами программа будет преобразована к виду):
Корень(сложить(квадрат(4),квадрат(3))).
Следующий шаг - замена составной функции Квадрат(4):
Корень(сложить(умножить(4,4), умножить(3,3))).
Теперь можно заменить примитивные функции Умножить(4,4) и Умножить(3,3) на их значения (которые они вычисляют):
Корень(сложить(16,9)).
Теперь функцию Сложить заменяем значением:
Корень(25).
5
- результат.
Основные черты функционального подхода:
- основная структура данных - связанный список (программа также представляется в виде списков);
- вместо операторов - функции;
- вместо явных циклов (итераций) - рекурсия.
Считается, что функциональный подход позволяет легко и естественно переходить к понятиям, связанным со сложными объектами предметной области. Это делается с помощью определения соответствующих составных функций над сложными структурами. Такие определения в удобной форме описывают зависимости между объектами. Функция - универсальный инструмент для представления этих зависимостей в различных областях. При этом операция суперпозиции позволяет легко использовать ранее созданные функции при построении новых.
Из языков функционального программирования наиболее широко известны lisp(list processing) и РЕФАЛ (Турчин ).
