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

Знайомство з ООП

Модуль 1: Python Core
Рівень 9 , Лекція 1
Відкрита

2.1 Основні концепції ООП

В основі об'єктно-орієнтованого підходу до програмування лежить парадигма ООП. Це коли всі сутності програми розглядаються як об'єкти. Об'єкти — це дані + методи/функції, які над цими даними щось роблять.

Також можна сказати, що у об'єкта є стан і поведінка. Стан об'єкта забезпечується його даними, які зберігаються в його внутрішніх змінних. Поведінка об'єкта — це сукупність всіх дій, які виконують його методи.

Об'єктів у середній програмі багато тисяч, у великій — мільйони. Щоб якось зменшити хаос, було вирішено організувати об'єкти в класи, а класи — в певну ієрархію.

Цікаво! Концепція ієрархії класів була взята з тваринного світу, де є люди, які є приматами, що є ссавцями, і т.д.

У кожного об'єкта є клас, за допомогою якого його створюють. З одного боку, клас — це певний шаблон об'єкта, з іншого — це самостійний об'єкт зі своїми особливостями (про них нижче).

Щоб краще зрозуміти концепцію класів, ознайомтесь з наступними визначеннями:

Клас:

Клас — це шаблон або схема для створення об'єктів, яка визначає атрибути і методи, характерні для всіх об'єктів цього типу. Класи дозволяють організувати дані та функції, які працюють з цими даними, в єдине ціле.

Об'єкт:

Об'єкт — екземпляр класу. Кожен об'єкт має стан (визначається атрибутами) і поведінку (визначається методами).

Інкапсуляція:

Інкапсуляція полягає в прихованні внутрішньої реалізації класу та наданні інтерфейсу для взаємодії з об'єктами цього класу. Це допомагає захистити дані та керувати доступом до них.

Наслідування:

Наслідування дозволяє одному класу (дочірньому) успадкувати атрибути і методи іншого класу (батьківського). Це сприяє повторному використанню коду і спрощенню його підтримки.

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

Поліморфізм дозволяє використовувати єдиний інтерфейс для роботи з об'єктами різних класів. Це досягається за рахунок перевизначення методів у дочірніх класах, які успадковуються від батьківських.

Абстракція:

Абстракція полягає у виділенні загальних характеристик об'єктів і створенні класів, які представляють ці загальні характеристики. Це допомагає спростити складні системи і поліпшити їх зрозумілість.

Якщо ти зрозумів хоча б половину – відмінно. Далі ми розберемо кожен з цих пунктів детальніше.

2.2 Абстракція

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

Уяви, що ти проектуєш структуру своєї майбутньої компанії. Ти можеш розподілити обов'язки секретаря, «розкидуючи» їх по кільком іншим посадам. Можеш розбити посаду виконавчого директора на кілька незалежних посад: фінансовий директор, технічний директор, директор з маркетингу, директор з персоналу. Або, наприклад, об'єднати посади офіс-менеджера і рекрутера в одну.

З точки зору програмування абстракція — це, так би мовити, правильний поділ програми на об'єкти. Зазвичай будь-яку велику програму можна десятками способів представити у вигляді взаємодіючих об'єктів. Абстракція дозволяє відібрати головні характеристики і опустити другорядні.

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

2.3 Інкапсуляція

Мета інкапсуляції — поліпшити якість взаємодії елементів за рахунок спрощення їх взаємодії.

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

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

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

2.4 Наслідування

У наслідування є дві сторони. Сторона програмування і сторона реального життя. З точки зору програмування наслідування — це спеціальне відношення між двома класами. Але набагато цікавіше, що ж таке наслідування з точки зору реальної життя.

Якби нам знадобилося щось створити в реальному житті, у нас є два шляхи:

  1. створити потрібну нам річ з нуля, витративши купу часу та сил;
  2. створити потрібну нам річ на основі вже існуючої.

Найбільш оптимальна стратегія виглядає так: беремо існуюче хороше рішення, трохи його доробляємо, підганяємо під свої потреби і використовуємо.

Якщо ми простежимо історію виникнення людини, то виявиться, що з моменту зародження життя на планеті пройшли мільярди років. А якщо уявити, що людина виникла з мавпи (на основі мавпи), то пройшло всього пара мільйонів років. Створення з нуля — довше. Значно довше.

У програмуванні теж є можливість створювати один клас на основі іншого. Новий клас стає нащадком (спадкоємцем) вже існуючого. Це дуже вигідно, коли є клас, який містить 80%-90% потрібних нам даних і методів. Ми просто оголошуємо відповідний клас батьком нашого нового класу, тоді у новому класі автоматично з'являються всі дані і методи класу-батька. Правда, зручно?

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

Поліморфізм — це поняття з області програмування. Воно описує ситуацію, коли за одним інтерфейсом ховаються різні реалізації. Якщо спробувати знайти його аналоги в реальному житті, то одним з таких аналогів буде процес керування автомобілем.

Якщо людина може керувати вантажівкою, то її можна посадити і за кермо швидкої, і за кермо спорткара. Людина може керувати машиною незалежно від того, що це за машина, тому що всі вони мають однаковий інтерфейс управління: кермо, педалі і важіль коробки передач. Внутрішній устрій машин різний, але всі вони мають однаковий інтерфейс управління.

Якщо повернутися до програмування, то поліморфізм дозволяє єдинообразно звертатися до об'єктів різних класів (зазвичай мають спільного предка) – річ, яку важко переоцінити. Цінність його тим вища, чим більша програма.

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

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ