Рассмотрим особенности объектно-ориентированного подхода к программированию в сравнении с функциональным подходом. Напомним, что классификация подходов к программированию была построена нами во вступительной лекции.
Важнейшим шагом на пути к совершенствованию языков программирования стало появление
объектно-ориентированного подхода к программированию
(или, сокращенно, ООП) и соответствующего класса языков. Именно исследование теории и практики проектирования и реализации программных систем по принципам
ООП и является основной целью второй части данного курса.
При объектно-ориентированном подходе программа представляет собой описание
объектов, их свойств (или атрибутов), совокупностей (или классов), отношений между ними, способов их взаимодействия и операций над
объектами (или методов).
Несомненным преимуществом данного подхода является концептуальная близость к предметной области произвольной структуры и назначения.
Механизм наследования
атрибутов и
методов позволяет строить производные понятия на основе базовых и таким образом создавать модель сколь угодно сложной предметной области с заданными
свойствами.
Еще одним теоретически интересным и практически важным свойством
объектно-ориентированного подхода является поддержка механизма
обработки событий, которые изменяют
атрибуты
объектов и моделируют их взаимодействие в предметной области.
Перемещаясь по иерархии классов от общих понятий предметной области к более конкретным (или от более сложных – к более простым) и наоборот, программист получает возможность изменять степень абстрактности или конкретности взгляда на моделируемый им реальный мир.
Использование ранее разработанных (возможно, другими коллективами программистов) библиотек объектов и
методов позволяет значительно сэкономить трудозатраты при производстве программного обеспечения, в особенности, типичного.
Объекты, классы и методы могут быть полиморфными, что делает реализованное программное обеспечение более гибким и универсальным.
Сложность адекватной (непротиворечивой и полной) формализации объектной теории порождает трудности тестирования и верификации созданного программного обеспечения. Пожалуй, это обстоятельство является одним из самых существенных недостатков
объектно-ориентированного подхода к программированию.
Наиболее известным примером объектно-ориентированного языка программирования является язык C++, развившийся из императивного языка С. Его прямым потомком и логическим продолжением является язык С#, который изучается в данном курсе.
Другие примеры объектно-ориентированных языков программирования: Visual Basic, Java, Eiffel, Oberon.
Переход от структурно-процедурного подхода к объектно-ориентированному программированию, подобно переходу от низкоуровневых языков программирования к языкам высокого уровня, требует значительных затрат на обучение. Естественно, что платой за это является повышение производительности труда программистов при проектировании и реализации программного обеспечения. Другое преимущество
ООП перед императивным подходом – более высокий процент повторного использования уже разработанного программного кода.
При этом, в отличие от предыдущих подходов к программированию,
объектно-ориентированный подход требует глубокого понимания основных принципов, или, иначе, концепций, на которых он базируется. К числу основополагающих понятий
ООП обычно относят
абстракцию данных, наследование, инкапсуляцию и
полиморфизм.
Зачастую в практических и учебных курсах по программированию слушатели не имеют четкого математического основания для формирования достаточно полного и ясного представления об основах
ООП. Преимущество предлагаемого курса заключается в том, что уже изученные в первой части курса разделы computer science (например, ламбда-исчисление и комбинаторная логика) позволяют сформировать глубокое и точное понимание фундаментальных понятий
объектно-ориентированного программирования. В частности, понятие абстракции – основной операции ламбда-исчисления – для нас является уже хорошо знакомым.
Поясним качественно фундаментальные принципы ООП.
Наследование конкретных атрибутов
объектов и функций оперирования объектами основано на иерархии.
Инкапсуляция означает "сокрытие"
свойств и
методов внутри
объекта.
Полиморфизм, как и в функциональном программировании, понимается как наличие функций с возможностью обработки данных переменного типа.
Рассмотрим более подробно такой фундаментальный принцип объектно-ориентированного подхода к программированию как
абстракция.
В разделах математики, исследующих моделирование процесса создания программ, под абстракцией принято понимать произвольное выражение языка программирования, которое является отличным от идентификатора.
Важнейшей операцией, которая была исследована нами в первой части курса, является операция вычисления значения выражения или команды, т.е. операция означивания (в частности, функция вычисления значения явно использовалась при построении семантики языка программирования). В этой связи важно установить, что является значением
абстракции. Будем считать, что значение функции или переменной может быть присвоено
абстракции и является значением последней.
В объектно-ориентированном программировании каждый объект представляет собой принципиально динамическую сущность, т.е. изменяется в зависимости от времени (а также от воздействия внешних по отношению к нему факторов). Иначе говоря,
объект обладает тем или иным образом поведения. В отношении
абстракции как объекта, поведение заключается в приложении функции к аргументу.
Как мы уже отмечали, концепция абстракции в объектно-ориентированном программировании адекватно моделируется посредством ламбда-исчисления. Точнее говоря, операция
абстракции в полной мере является моделью одноименного понятия
ООП.