Назад Зміст Вперед

Основи ООП

Основою об'єктно-орієнтованого програмування є об'єкти. ООП програма - набір взаємодіючих об'єктів.

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

Одна із головних задач об'єктно-орієнтованих програм - правильно визначити, які об'єкти необхідні для вирішення задачі. З реальними об'єктами це, як правило,  простіше.

Класи

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

Клас - опис об'єктів. Існує таке визначення: клас є складальним кресленням для об'єктів. Також клас часто називають об'єктним типом.

У програмі може бути тільки один об'єкт даного типу, а може бути і безліч однотипних об'єктів.

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

Всі однотипні об'єкти будуть створюватися на основі одного і того ж класу. Тобто, якщо в програмі потрібні дві точки з координатами 2, 6 і 4, 5, то не треба для кожної з них робити окремий клас. Клас в такій ситуації буде один, в ньому буде описано, що у точок є дві цілочисельні координати, а вже в створених на його основі двох об'єктах будуть знаходитися потрібні значення. Наприклад, є клас, який описує стіл. З його допомогою можна створити об'єкти столів різних розмірів.

Часто на стадії проектування класи і об'єкти зображують у вигляді діаграм на спеціальній мові UML (Unified Modelling Language).Структура класу, зображена за допомогою UML

Абстракція

Існує ряд основних принципів, на яких базується програмування взагалі і об'єктно-орієнтоване програмування зокрема. Вважають, що об'єктно-орієнтоване програмування ґрунтується на трьох китах: інкапсуляції, успадкування та поліморфізм.

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

Поняття абстракції

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

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

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

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

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

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


Дані, що містяться в об'єкті називаються властивостями об'єкта.
Функції, що містяться в об'єкті називаються методами об'єкта.



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

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

Чим простіша загальнодоступна частина ваших об'єктів, тим краще.

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

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

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

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

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

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

Важливо, якщо внесені зміни в батьківський клас, ці ж зміни автоматично будуть застосовані до дочірнього. Так якщо в батьківському класі точки з'явиться третя координата z, дочірній клас в підсумку матиме теж три координати. Це зручно, наприклад, при виправленні помилок. Помилку досить буде виправити в одному місці в батьківському класі і дочірні отримають це виправлення автоматично.

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

Поліморфізм

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

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

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

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