Объектно-ориентированное программирование
Основное понятие – объект, представляющий собой совокупность атрибутов, методов их обработки и событий, на которые объект может реагировать.
В качестве строительных блоков используются объекты, содержащие свои собственные коды и данные. Структура программ представляется графом взаимодействия объектов, а не деревом иерархии, как в структурном проектировании.
Объектно-ориентированный анализ направлен на создание моделей реальной действительности на основе объектно-ориентированного подхода.
Объектно-ориентированное проектирование соединяет в себе процесс объектной декомпозиции и приемы представления моделей, отражающих логическую (классы и объекты) и физическую структуру системы (процессы и деление на компоненты, файлы или модули), а также ее статические и динамические аспекты.
Объекты могут иметь идентичную структуру и отличаться только значениями атрибутов. В этом случае в программе создается новый тип, который называют классом, а каждый конкретный объект, имеющий структуру этого класса, называют экземпляром класса. Объект – это структурированная переменная типа класс, содержащая всю информацию о некотором физическом предмете или реализуемом в программе понятии.
Все объекты - представители данного класса аналогичны друг другу в том смысле, что они имеют один и тот же набор операций - методов.
В объектно-ориентированном программировании выделяют следующие три фундаментальных принципа - инкапсуляция, наследование и полиморфизм.
Полиморфизм означает свойство переопределять методы наследуемого класса и корректно их использовать в различных контекстах. Целью полиморфизма является использование одного имени для задания общих для класса действий, причем каждый объект или класс иерархии имеет возможность по-своему реализовать это действие своим собственным, подходящим для него, кодом. Таким образом, полиморфизм является свойством классов решать схожие по смыслу проблемы разными способами.
Инкапсуляция означает свойство скрывать внутреннюю структуру класса, в которой описываются его методы и атрибуты, значения которых в промежутках между вызовами методов класса могут меняться.
Проектирование программных и технических систем базируется на том условии, что никакая подсистема данного уровня не должна зависеть от устройства любой другой подсистемы этого уровня. Такая независимость внутреннего устройства одного объекта от внутреннего устройства другого является инкапсуляцией.
В объектно-ориентированном программировании принцип инкапсуляции используется для изоляции класса от остальных частей программы, чтобы сделать его самодостаточным для решения конкретной задачи.
Наследование означает возможность создавать новые классы на основе существующих с наследованием всех их свойств и методов и добавлением собственных. Класс, не имеющий предшественника, называют базовым.
Принцип наследования оперирует с понятиями ≪предок - потомок≫ и предусматривает расширение набора свойств наследника за счет принятия всех свойств предка.
Принцип наследования приводит к созданию ветвящегося дерева классов. Каждый потомок дополняет возможности своего родителя новыми и передает их своим потомкам.
Рассмотренные концепции относятся к императивной парадигме программирования – описывает процесс вычисления в виде инструкций, меняющих состояние данных. При таком подходе активно используется присваивание.
Императивной парадигме противопостовляется декларативная парадигма, примером которой является функциональное программирование. В функциональном программировании процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).
Основной особенностью функционального программирования, определяющей как преимущества, так и недостатки данной парадигмы, является то, что в ней реализуется модель вычислений без состояний.
Императивная программа на любом этапе исполнения имеет состояние – совокупность значений всех переменных, что производит побочные эффекты. Функциональная программа состояния не имеет и побочных эффектов не производит. То, что в императивных языках делается путём присваивания значений переменным, в функциональных достигается путём передачи выражений в параметры функций. Непосредственным следствием становится то, что чисто функциональная программа не может изменять уже имеющиеся у неё данные, а может лишь порождать новые путём копирования и/или расширения старых.
Как следствие, порождение новых данных приводят к необходимости постоянного выделения и автоматического освобождения памяти. Поэтому в системе исполнения функциональной программы обязательным компонентом становится высокоэффективный сборщик мусора.