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

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

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

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

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


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

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

Однак кращі уми начебто вже зійшлися на такому:

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


4. Успадкування

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

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

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

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

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

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


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

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

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

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

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