Циклы, ветвления и функции – основа структурного программирования. Они отлично подходят для создания небольших и простых программ. Но для крупных проектов часто выбирают объектно-ориентированное программирование (ООП). Что же из себя представляет эта парадигма и в чем её преимущества?
Корни ООП уходят в 60-е годы прошлого века, но окончательно свои основы и популярность оно приобрело в 80-е годы благодаря вкладу Алана Кея.
Однако не все современные языки программирования поддерживают эту парадигму. Например, язык C, который часто применяется для системного программирования (разработка операционных систем, драйверов, утилит), не поддерживает объектно-ориентированный подход.
В Python ООП имеет ключевое значение. Даже если использовать структурную парадигму, программисты неизбежно сталкиваются с объектами и классами, встроенными в язык.
Итак, что представляет собой объектно-ориентированное программирование? Из названия следует, что оно сосредотачивается на объектах, вокруг которых и строится весь процесс.
В реальном мире мы воспринимаем окружение как набор объектов с определенными свойствами, взаимодействующих и изменяющихся. Этот подход был адаптирован в программировании.
Переход к ООП потребовал более высокого уровня абстракции и умения создавать "виртуальные миры" и управлять задачами. Это существенно облегчило разработку крупных проектов.
Например, при создании игры программисты могут представить её как комплекс цифровых героев и окружающей среды с предметами. Каждый воин, меч, дерево или дом – это объект, содержащий свои свойства и методы для взаимодействия и изменения состояний.
Каждый разработчик может быть ответственен за свою группу объектов, договариваясь о взаимодействии только через интерфейсы. Таким образом, разработчик окружения должен знать лишь, что при контакте коровы с травой, последней станет меньше, но не как реализована функция роста коровы.
Ключевое различие между программой, написанной в структурном стиле, и объектно-ориентированной версией заключается в подходе. В первом случае акцент делается на логике и последовательности действий, тогда как во втором – на взаимодействии объектов.
Понятия объектно-ориентированного программирования
Основные концепты ООП включают класс, объект, наследование, инкапсуляцию и полиморфизм. В Python класс соответствует понятию типа данных.
Что такое класс или тип? Возьмем реальный пример: конкретный стол – это объект, а общее понятие о столах – это класс. Класс объединяет все реальные объекты столов, предоставляя их общую характеристику.
Пример: в Python тип int представляет класс целых чисел, а конкретные числа, такие как 5, 100134, -10 и другие, являются объектами этого класса.
В Python объекты также называют экземплярами, поскольку классы самого языка считаются объектами класса type, как и модули – объектами класса module. Для предотвращения путаницы, объекты, основанные на пользовательских классах, называют экземплярами. Но в рамках данного курса чаще будем использовать термин "объекты".
Ключевое понятие в ООП – это наследование. Рассмотрим столы: общий класс описывает столы, но можно выделить подкатегории, такие как письменные или журнальные столы, каждая из которых может наследовать свойства общего класса и добавлять специфические особенности. Благодаря этому, общий класс выступает родительским, а специализированные – дочерними.
Дочерние классы наследуют особенности родительских и могут модифицировать их характеристики. Когда создается экземпляр стола, определяется, к какому классу он относится. Например, стол может принадлежать классу журнальных столов, наследуя общие свойства и дополнительные, однако не получив свойства письменных или обеденных столов.
Инкапсуляция трактуется двояко. В большинстве языков она означает скрытие данных, чтобы предотвратить небезопасный доступ. Однако в Python инкапсуляция в виде полного скрытия данных отсутствует; можно получить доступ к любому свойству объекта и изменить его. Несмотря на это, Python позволяет имитировать скрытие данных, если это необходимо.
Отсутствие полноценной инкапсуляции упрощает работу с кодом, но требует особого внимания к пространствам имен.
Второе значение инкапсуляции – объединение свойств и поведения в классе. Это часть определения ООП и присуще всем ОО-языкам.
Полиморфизм обозначает множество форм. Проще говоря, классы с отличающимся кодом могут иметь схожие интерфейсы. Например, в Python операция + используется как для сложения чисел, так и для конкатенации строк. Хотя реализация отличается, интерфейсы остаются идентичными.
Вы уже сталкивались с плюсом как с примером полиморфизма. Для чисел он обозначает сложение, а для строк – соединение. Реализация в обоих случаях различна.
Практическая работа
Изучите диаграмму и подумайте над следующими вопросами:
- Какие фигуры на схеме можно назвать классами и какие – объектами? Что символизируют пунктирные линии?
- Может ли объект быть частью множества классов? Может ли один класс иметь много объектов?
- Звезды скорее характеризуются различными свойствами или поведением? Может ли различие в свойствах влиять на поведение?
- Что, по вашему мнению, обозначают стрелки?