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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.2 Абстракция

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

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

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

абстракция

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

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

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

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

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

кабинa Боинга

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1
Задача
Модуль 1: Web Core, 20 уровень, 1 лекция
Недоступна
Наследование методов
Наследование методов
1
Задача
Модуль 1: Web Core, 20 уровень, 1 лекция
Недоступна
Object.create
Object.create
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ilona Уровень 23
15 апреля 2025
Плюсую Ксении. Странная подача материала.
Ксения Уровень 23
9 января 2025
"Программа должна включать создание объекта child, который наследует от parent с использованием свойства __proto__" а где объяснение данного материала?
Алексей Уровень 3
11 января 2025
См следующую лекцию
Ксения Уровень 23
17 января 2025
то есть нормально, что в задачах спрашивается материал, который в данной лекции не объяснялся?
Виктор Рябов Уровень 21
10 марта 2025
да. В таких случаях следует поискать объяснение более подробное самому если что-то не понятно. Как в английском - если слово не понятно, то сложно читать дальше, лучше его сначала понять https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/proto