Вы наверняка не раз слышали словосочетания «процедурное программирование», «объектно-ориентированное программирование» и «функциональное программирование». Всё это обозначения различных парадигм (стилей) программирования. Есть целый зоопарк «различных программирований».
Парадигма программирования — это совокупность идей и понятий, определяющих стиль написания компьютерных программ.
Можно сказать, что это определенный взгляд на явления окружающего мира и представление о возможных действиях с ними. В программировании под парадигмой принято понимать обобщение о том, как должна быть организована работа программы.
Перечислим их с короткими пояснениями:
ИМПЕРАТИВНОЕ |
программа = последовательность действий, связанных условными и безусловными переходами |
ПРОЦЕДУРНОЕ |
программа = последовательность процедур, каждая из которых есть последовательность элементарных действий и вызовов процедур, структурированных с помощью структурных операторов if, for и while |
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ |
программа = несколько взаимодействующих объектов, функциональность (действия) и данные распределяются между этими объектами |
ФУНКЦИОНАЛЬНОЕ |
программа = система определений функций, описание того, что нужно вычислить, а как это сделать — решает транслятор; последовательность действий не прослеживается |
ПРОДУКЦИОННОЕ (ЛОГИЧЕСКОЕ) |
программа = система определений и правил вида «условие => новый факт» |
СЕНТЕНЦИАЛЬНОЕ |
программа = система правил вида «шаблон => трансформирующее действие» |
СОБЫТИЙНОЕ |
программа = система правил вида «событие => новые события» + диспетчер событий |
АВТОМАТНОЕ |
программа = конечный автомат или автомат специального типа |
Среди прочего выделяют такие парадигмы программирования как директивное (структурное), объектно-ориентированное и декларативное (функционально-логическое). Многие языки поддерживают несколько парадигм программирования. С другой стороны, есть языки ориентированные исключительно на реализацию одной парадигмы.
Структурное (директивное) программирование
Некоторые представители: Fortran, Pascal, C.
Директивная (структурная) программа предписывает, как достичь результата, пошагово описывая действия. Поэтому такое программирование является достаточно легким для понимания. В структурном программировании от входных данных полностью зависит последовательность выполнения команд.
В директивном программировании в свое время возникла концепция локализации части кода в так называемые подпрограммы (функции, методы), с последующим их вызовом из разных мест основной программы. При вызове в подпрограмму могут передаваться какие-либо данные в виде аргументов; а подпрограмма, в свою очередь, может возвращать в главную программу результат (т.е. полученные в ходе ее выполнения данные).
Представители функциональных языков: List, Haskell.
Представитель логических языков: Prolog.
Декларативная программа заявляет (декларирует), что должно быть достигнуто в качестве цели. Важным является точная формулировка задачи. Программист не задает алгоритм для ее решения.
Функциональное программирование основано на математическом понятии функции, которая не изменяет свое окружение; это отличие функционального программирования от функций в структурных языках. Функциональная программа состоит из совокупности определений функций, которые в свою очередь представляют собой вызовы других функций и предложений, управляющих последовательностью вызовов. Каждая функция возвращает некоторое значение в вызвавшую его функцию, вычисление которой после этого продолжается; этот процесс повторяется до тех пор, пока не будет достигнут результат.
В логическом программировании программы выражены в виде формул математической логики, и решение задачи достигается путем вывода логических следствий из них.
Объектно-ориентированное программирование
Представители объектно-ориентированных языков: С++, Java.
Следующим шагом в развитии технологий программирования было появление объектно-ориентированного программирования. Здесь программный код перестал быть «плоским», и программист оперирует не просто процедурами и функциями, а целыми классами. ООП призвано решать более сложные и объемные задачи по сравнению с директивным программированием.
Особое внимание уделяется данным, которые представляются в программе в виде объектов. Объекты взаимодействуют между собой с помощью механизма передачи сообщений. Задача программиста – реализовать такие объекты, при взаимодействии которых можно будет получать желаемый результат.
Класс — совокупность свойств, методов и событий.
Объект — это инкапсулированная абстракция с четко определенным интерфейсом.
Что означает «совокупность»? Это значит, что класс как бы состоит из методов, свойств и событий, и они обеспечивают его полноценную работу. Представим себе кнопку. Она обладает:
- свойствами (цвет, текст на кнопке, шрифт текста и т. д.);
- событиями (события пользовательского ввода, например, нажатие на кнопку);
- методами (обеспечивающими работу кнопки, например, метод прорисовки текста, прорисовки фокуса и т. д.).
Если все это объединить, то получается автономный класс, который может работать в различных условиях. В этом случае достаточно только установить кнопку на форме, и она уже готова к применению. Как же оформляются свойства, методы и события класса в программах?
- Свойства — это переменные, которые влияют на состояние класса. Например, ширина, высота.
- Методы — это те же процедуры и функции, т. е. это то, что класс умеет делать (вычислять). Например, класс может иметь процедуру для вывода какого — то текста на экран. Эта процедура и есть метод, который принадлежит классу.
- События — это те же процедуры и функции, которые вызываются при наступлении определенного события, только эти процедуры могут как принадлежать классу, так и находиться вне его. Вы создаете процедуру в программе и говорите объекту, что в случае наступления некоторого события, нужно вызвать эту процедуру, и она будет вызываться. Например, если изменилось какое — то свойство, может быть сгенерировано соответствующее событие и вызвана соответствующая процедура, и вы сможете отреагировать на событие.
В основе ООП лежат такие понятия как наследование, полиморфизм и инкапсуляция.