JavaRush /Курси /Java Syntax Zero /Об’єктно-Орієнтоване Програмування

Об’єктно-Орієнтоване Програмування

Java Syntax Zero
Рівень 8 , Лекція 5
Відкрита

1. Знайомство з принципами ООП

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

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

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

Випробували багато підходів, і на основі найкращих практик сформулювали 4 принципи ООП. Це: абстракція, інкапсуляція, наслідування і поліморфізм. Раніше їх було тільки три, але потім вирішили додати ще й абстракцію.


2. Абстракція

В уанеті народ досі сперечається над визначенням абстракції в ООП. І проблема навіть не в тому, що всі неправі, а в тому, що всі праві. Чим менша програма, тим сильніше абстракція прив’язана до мови Java, чим більша, тим сильніше прив’язана до моделювання/спрощення об'єктів реального світу.

Та, здається, найкращі уми зійшлися на тому, що:

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

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

Абстракція в реальному житті

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

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

Ти придумуєш назви посад у своїй фірмі, а потім «розподіляєш» обов'язки по цих посадах. Абстракція – відволікання від цілісності об'єкта і виділення його основних властивостей і складових, потрібних нам.

Знайомство з принципами ООП. Абстракція

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


3. Інкапсуляція

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

Знайомство з принципами ООП.Інкапсуляція

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

Знайомство з принципами ООП.Інкапсуляція

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

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


4. Наслідування

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

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

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

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

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

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


5. Поліморфізм

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

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

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

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


Коментарі (7)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Valentyna Рівень 30
9 січня 2024
Мені поки важко зрозуміти абстракцію. Це про те, що коли ми створюємо об'єкт, ми надаємо цьому об'єкту певні властивості? Типу для класа Тварина - тварина може ходити, бігати, видавати звук,..?
Михайло Рівень 9 Expert
10 січня 2024
Не просто властивості та методи, а мінімальну їхню кількість. Приклад з лекції: замало в компанії створити посаду "директор з маркетингу". Цей об'єкт потрібно наділити тією мінімальною кількістю властивостею, аби він вичерпно виконував свої зобов'язання. Або, до прикладу, паспорт. Інформації в паспорті (а це доволі абстрактно) достатньо, аби точно ідентифікувати людину.
12 грудня 2022
"Чотири принципи ООП — це як чотири ніжки стільця" - але ж їх спочатку було 3) Получається, якось стояли)
Unfo Рівень 23
17 грудня 2022
як трайпод і стояли) в нього три ноги. а стоїть.
Roma Chernesh Рівень 16
20 грудня 2022
Барні стільці, взагалі, на одній ножці стоять:)
Vlad Рівень 17
29 вересня 2023
😂😂😂😂😂
Pan Vitali Moroz Рівень 51
22 вересня 2022
Гарно, дякую