2. 2
Парадигма (стиль) программирования
– это совокупность идей и понятий, определяющих стиль
написания компьютерных программ
(подход к программированию).
Это способ построения программ, основанный на
определенных принципах программирования, и выбор
подходящего языка, который делает понятными
программы, написанные в этом стиле.
() Владислав Лавров, vlavrov.com
3. 3
Основные парадигмы программирования:
1) процедурно-ориентированный (алгоритмы);
2) объектно-ориентированный (классы и объекты);
3) функциональный (функции);
4) логико-ориентированный (цели, часто выраженные в
терминах исчисления предикатов);
5) ориентированный на ограничения (инвариантные
соотношения)
() Владислав Лавров, vlavrov.com
4. 4
Процедурно-ориентированный стиль
(императивный стиль, т.е. директивный, авторитарный)
• Программирование состоит из последовательности операторов
(инструкций), задающих процедуру (алгоритм) решения задачи.
В основе – принцип последовательного изменения вычислителя в
пошаговом режиме.
• Назначение: решение задач, для которых последовательное
исполнение каких-либо команд является естественным.
Например, управление современными аппаратными средствами
вычислительной техники
• Языки: Fortran (1954), Algol (1960), Basic (1963), Pascal (1970),
C (1972), Ada (1979).
Подробнее http://bourabai.ru/alg/system2.htm#2216
() Владислав Лавров, vlavrov.com
5. 5
Объектно-ориентированный стиль
• Подход использует объектную декомпозицию, при которой
статическая структура системы описывается в терминах объектов и
связей между ними, а поведение системы описывается в терминах
обмена сообщениями между объектами.
• Назначение: любая предметная область
• Языки: Simula (1962), C++ (1983), Object Pascal (1984), Java (1995),
С # (2000).
Подробнее http://bourabai.ru/alg/system2.htm#222
() Владислав Лавров, vlavrov.com
6. 6
Функциональный стиль
• Основан на способе составления программ, в которых
единственным действием является вызов функции. Функции
обмениваются между собой данными непосредственно, без
использования промежуточных переменных и присвоений.
• Назначение: обработка естественного языка, экспертные
консультирующие системы, проблемы зрительного восприятия.
• Языки: LISP (1958), РЕФАЛ (1968), Haskell (1990, 1998).
Подробнее http://bourabai.ru/alg/system2.htm#223
() Владислав Лавров, vlavrov.com
7. 7
Логико-ориентированный стиль
• Программ содержит описание проблемы в терминах фактов и
логических формул (правил), а решение система выполняет с
помощью механизмов логического вывода.
• Назначение: экспертные системы, искусственный интеллект.
• Языки: Prolog (1971), LOGLISP (1982), T-Prolog (1983),
Mercury (1993)
Подробнее http://bourabai.ru/alg/system2.htm#224
() Владислав Лавров, vlavrov.com
8. 8
Стиль, ориентированный на ограничения
• Подход, при котором в программах определяются тип данных
решения, предметная область решения и ограничения на значения
искомого решения. Программирование в терминах постановок
задач.
• Назначение: задачи исследования операций, искусственный
интеллект.
• Языки: УТОПИСТ (Универсальные Текстовые ОПИСания Терминов,
1980), OPL (1998).
Подробнее http://bourabai.ru/alg/system2.htm#225
() Владислав Лавров, vlavrov.com
9. 9
• переход от расчетов по формулам к сложным задачам
моделирования систем
• увеличение объемов обрабатываемых данных
• повышение сложности программ, резкое увеличение объемов кода
(сотни тысяч и миллионы строк !)
Современные направления развития программ
() Владислав Лавров, vlavrov.com
Сложность современных
программ превышает
возможности одного человека !
10. 10
Что делать?
() Владислав Лавров, vlavrov.com
• коллективная разработка;
• каждый делает свою часть независимо от других;
• части программы легко «собрать» вместе.
Как это сделать?
11. 11
Борьба со сложностью
() Владислав Лавров, vlavrov.com
подзадача 1 подзадача 3
подзадача 2.1 подзадача 2.2 подзадача 2.3
задача
подзадача 2
Декомпозиция – это разбиение системы на подсистемы, каждая из
которых может изучаться и выполняться отдельно
> 100 000 строк???
«Техника борьбы со сложностью известна с античных
времен: “Divide et impera” (разделяй и властвуй)»
Э. Дейкстра
12. 12
Описывает структуру объектов, составляющих систему,
их атрибуты, операции, взаимосвязи с другими
объектами.
В объектной модели должны быть отражены те понятия
и объекты реального мира, которые важны для
разрабатываемой системы.
Объектная модель
() Владислав Лавров, vlavrov.com
14. 14
1.1. Абстрагирование
Абстракция выделяет существенные характеристики некоторого
объекта, отличающие его от всех других видов объектов и, таким
образом, четко определяет его концептуальные границы с точки
зрения наблюдателя.
Абстрагирование концентрирует внимание на внешних особенностях
объекта и позволяет отделить самые существенные особенности
поведения от несущественных.
С точки зрения программирования, абстракция – это правильное
разделение программы на объекты.
() Владислав Лавров, vlavrov.com
17. 17
1.2. Инкапсуляция
Инкапсуляция (лат. in capsula) – размещение в оболочке, изоляция,
закрытие чего-либо инородного с целью исключения влияния на
окружающее.
В программировании инкапсуляция – это процесс отделения друг от
друга элементов объекта, определяющих его устройство и
поведение; инкапсуляция служит для того, чтобы изолировать
контрактные обязательства абстракции от их реализации.
() Владислав Лавров, vlavrov.com
18. 18
Полет на самолете с точки зрения пассажира
Инкапсуляция. Пример.
() Владислав Лавров, vlavrov.com
20. 20
1.3. Модульность
Модульность – это разделение программы на фрагменты, которые
компилируются по отдельности, но могут устанавливать связи с
другими модулями. Связи между модулями – это их представления
друг о друге.
В программировании модули выполняют роль физических
контейнеров, в которые помещаются определения классов и
объектов при логическом проектировании системы.
() Владислав Лавров, vlavrov.com
22. 22
1.4. Иерархичность
Иерархия – это упорядочение абстракций, расположение
их по уровням.
В ООП основными видами иерархических структур
применительно к сложным системам являются:
• структура классов (иерархия "is-a", быть)
• структура объектов (иерархия "part of", часть).
() Владислав Лавров, vlavrov.com
25. 25
Наследование по типу «part of» (продолжение)
Иерархичность. Пример.
() Владислав Лавров, vlavrov.com
26. 26
1.5. Наследование
Наиболее оптимальная стратегия создания объекта в реальной
жизни: берем существующее хорошее решение, немного его
дорабатываем, подгоняем под свои нужды и используем.
В программировании наследование – это специальное отношение
между двумя классами.
Есть возможность создавать один класс на основе другого. Новый
класс становится потомком (наследником) уже существующего, при
этом содержит 80%-90% нужных нам данных и методов.
() Владислав Лавров, vlavrov.com
27. 27
1.6. Типизация и полиформизм
Тип – точная характеристика свойств, включая структуру
и поведение, относящуюся к некоторой совокупности
объектов.
Типизация – это способ защититься от использования
объектов одного класса вместо другого, или, по крайней
мере, управлять таким использованием.
() Владислав Лавров, vlavrov.com
30. 30
Полиморфизм
Понятие типизации связано с полиморфизмом: одно и то же имя
может означать объекты разных типов, но, имея общего предка, все
они имеют и общее подмножество операций, которые можно над
ними выполнять.
Полиморфизм описывает ситуацию, когда за одним интерфейсом
скрываются разные реализации. Он позволяет единообразно
обращаться к объектам различных классов (обычно имеющих
общего предка)
() Владислав Лавров, vlavrov.com
33. 33
1.7. Параллелизм
Параллелизм позволяет различным объектам действовать
одновременно. Параллелизм – это свойство, отличающее активные
объекты от пассивных.
В параллельных системах недостаточно определить поведение
объекта, надо еще принять меры, гарантирующие, что он не будет
разрушен несколькими независимыми процессами.
() Владислав Лавров, vlavrov.com
35. 35
1.8. Сохраняемость
– это способность объекта существовать во времени, переживая
породивший его процесс, и (или) в пространстве, перемещаясь из
своего первоначального адресного пространства.
Например:
• Промежуточные результаты вычисления выражений.
• Локальные переменные в вызове процедур.
• Собственные переменные, глобальные переменные и динамически
создаваемые данные.
• Данные, сохраняющиеся между сеансами выполнения программы.
• Данные, сохраняемые при переходе на новую версию программы.
() Владислав Лавров, vlavrov.com
37. 37
Объектно-ориентированное программирование
(object-oriented programming, OOP)
– это методология программирования, основанная на представлении
программы в виде совокупности объектов, каждый из которых является
экземпляром определенного класса, а классы образуют иерархию
наследования.
В данном определении можно выделить три части:
1) OOP использует в качестве базовых элементов объекты,
а не алгоритмы;
2) каждый объект является экземпляром какого-либо определенного
класса;
3) классы организованы иерархически.
() Владислав Лавров, vlavrov.com