JavaRush /Курсы /Модуль 1: Python Core /Знакомство с ООП

Знакомство с ООП

Модуль 1: Python Core
9 уровень , 1 лекция
Открыта

2.1 Основные концепции ООП

В основе объектно-ориентированного подхода к программированию лежит парадигма ООП. Это когда все сущности программы рассматриваются как объекты. Объекты — это данные + методы/функции, которые над этими данными что-то делают.

Также можно сказать, что у объекта есть состояние и поведение. Состояние объекта обеспечивается его данными, которые хранятся в его внутренних переменных. Поведение объекта — это совокупность всех действий, которые выполняют его методы.

Объектов в средней программе многие тысячи, в большой — миллионы. Чтобы как-то уменьшить хаос, было решено организовать объекты в классы, а классы — в некую иерархию.

Это интересно! Концепция иерархии классов была взята из животного мира, где есть люди, которые являются приматами, которые являются млекопитающими, и т.д.

У каждого объекта есть класс, с помощью которого его создают. С одной стороны, класс — это некий шаблон объекта, с другой — это самостоятельный объект со своими особенностями (о них ниже).

Чтобы лучше понять концепцию классов, ознакомьтесь со следующими определениями:

Класс:

Класс — это шаблон или схема для создания объектов, который определяет атрибуты и методы, характерные для всех объектов этого типа. Классы позволяют организовать данные и функции, работающие с этими данными, в единое целое.

Объект:

Объект — экземпляр класса. Каждый объект обладает состоянием (определяется атрибутами) и поведением (определяется методами).

Инкапсуляция:

Инкапсуляция заключается в скрытии внутренней реализации класса и предоставлении интерфейса для взаимодействия с объектами этого класса. Это помогает защитить данные и управлять доступом к ним.

Наследование:

Наследование позволяет одному классу (дочернему) унаследовать атрибуты и методы другого класса (родительского). Это способствует повторному использованию кода и упрощению его поддержки.

Полиморфизм:

Полиморфизм позволяет использовать единый интерфейс для работы с объектами разных классов. Это достигается за счёт переопределения методов в дочерних классах, которые наследуются от родительских.

Абстракция:

Абстракция заключается в выделении общих характеристик объектов и создании классов, которые представляют эти общие характеристики. Это помогает упростить сложные системы и улучшить их понятность.

Если вы поняли хотя бы половину – отлично. Дальше мы разберем каждый из этих пунктов подробнее.

2.2 Абстракция

Хорошим примером абстракции в реальной жизни является описание должностей в компании или организации. Название должности — это одно, а обязанности каждой конкретной должности — это уже совсем другое.

Представь, что ты проектируешь структуру своей будущей компании. Ты можешь распределить обязанности секретаря, «раскидав» их по нескольким другим должностям. Можешь разбить должность исполнительного директора на несколько независимых должностей: финансовый директор, технический директор, директор по маркетингу, директор по персоналу. Или, например, объединить должности офис-менеджера и рекрутера в одну.

С точки зрения программирования абстракция — это, скажем так, правильное разделение программы на объекты. Обычно любую большую программу можно десятками способов представить в виде взаимодействующих объектов. Абстракция позволяет отобрать главные характеристики и опустить второстепенные.

Абстракция — это как стратегия в военном деле. Плохая стратегия — и никакой гениальной тактикой ситуацию уже не исправить.

2.3 Инкапсуляция

Цель инкапсуляции — улучшить качество взаимодействия элементов за счёт упрощения их взаимодействия.

А лучший способ упростить что-то — это скрыть все сложное от посторонних глаз. Например, если тебя посадят в кабину Боинга, ты не сразу разберёшься, как им управлять.

С другой стороны, для пассажиров самолёта всё выглядит проще: купил билет, сел в самолёт, взлетели и приземлились. Ты можешь с легкостью перелететь с континента на континент, обладая только навыками «купить билет» и «сесть на самолёт». Все сложности в виде подготовки самолёта к полёту, взлёта, посадки и различных внештатных ситуаций скрыты от нас. Не говоря уже о спутниковой навигации, автопилоте и диспетчерских центрах в аэропортах. И это упрощает нам жизнь.

С точки зрения программирования, инкапсуляция — это «сокрытие реализации». Мне нравится такое определение. Наш класс может содержать сотни методов и реализовывать очень сложное поведение в различных ситуациях. Но мы можем скрыть от посторонних глаз все его методы (обрамить их имена «__» с двух сторон), а для взаимодействия с другими классами оставить всего пару-тройку методов. Тогда все остальные классы нашей программы будут видеть в этом классе всего три метода и будут вызывать именно их. А все сложности будут скрыты внутри класса, как кабина пилотов от счастливых пассажиров.

2.4 Наследование

У наследования есть две стороны. Сторона программирования и сторона реальной жизни. С точки зрения программирования наследование — это специальное отношение между двумя классами. Но гораздо интереснее, что же такое наследование с точки зрения реальной жизни.

Если бы нам понадобилось что-то создать в реальной жизни, у нас есть два пути:

  1. создать нужную нам вещь с нуля, потратив кучу времени и сил;
  2. создать нужную нам вещь на основе уже существующей.

Наиболее оптимальная стратегия выглядит так: берём существующее хорошее решение, немного его дорабатываем, подгоняем под свои нужды и используем.

Если мы проследим историю возникновения человека, то окажется, что с момента зарождения жизни на планете прошли миллиарды лет. А если представить, что человек возник из обезьяны (на основе обезьяны), то прошла всего пара миллионов лет. Создание с нуля — дольше. Гораздо дольше.

В программировании тоже есть возможность создавать один класс на основе другого. Новый класс становится потомком (наследником) уже существующего. Это очень выгодно, когда есть класс, который содержит 80%–90% нужных нам данных и методов. Мы просто объявляем подходящий класс родителем нашего нового класса, тогда в новом классе автоматически появляются все данные и методы класса-родителя. Правда, удобно?

2.5 Полиморфизм

Полиморфизм — это понятие из области программирования. Оно описывает ситуацию, когда за одним интерфейсом скрываются разные реализации. Если постараться поискать его аналоги в реальной жизни, то одним из таких аналогов будет процесс управления автомобилем.

Если человек может управлять грузовиком, то его можно посадить и за руль скорой, и за руль спорткара. Человек может управлять машиной вне зависимости от того, что это за машина, потому что все они имеют одинаковый интерфейс управления: руль, педали и рычаг коробки передач. Внутреннее устройство машин разное, но все они имеют одинаковый интерфейс управления.

Если вернуться к программированию, то полиморфизм позволяет единообразно обращаться к объектам различных классов (обычно имеющих общего предка) – вещь, которую трудно переоценить. Ценность его тем выше, чем больше программа.

ООП — это принципы. Внутренние законы. Каждый из них нас в чем-то ограничивает, давая взамен большие преимущества, когда программа вырастает до больших размеров. Четыре принципа ООП — это как четыре ножки стула. Убери хотя бы одну, и вся система станет неустойчивой.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ