Класи ОВП. Об 'єктно-орієнтоване програмування

Класи ОВП. Об 'єктно-орієнтоване програмування

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

Що таке ОВП (об 'єктно-орієнтоване програмування)

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


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

Поняття об 'єктно-орієнтованого програмування (ОВП) невід' ємно пов 'язане з такими критеріями:

  • Абстракція.
  • Інкапсуляція.
  • Успадкування.
  • Поліморфізм.

Розгляньмо всі з них докладніше.

Абстракція

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

Ми намагаємося вибірково зосередитися тільки на тих речах, які важливі для нас (в житті) або для нашого модуля (в програмуванні). Зміна одного незалежного додатка не впливає на інші. Єдине, що потрібно знати, - це те, що він нам дає. Людина, яка використовує цей модуль, не повинна турбуватися про те, як завдання вирішується, що саме відбувається у фоновому режимі.

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


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

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

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

Спадкування

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

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

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

Поліморфізм

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

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


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

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

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

Особливості понять "" клас "" і "" об 'єкт ""

Щоб почати працювати з об 'єктно-орієнтованим програмуванням, нам потрібно розібратися, що таке клас ОВП і об' єкт. Важливо розуміти різницю між ними. Клас - це план для створення об 'єкта. Він визначає атрибути та поведінку. Це схоже на інженерний креслення будинку. Об 'єкт є примірником класу. Ось така між ними різниця. У прикладі нижче показано, яким чином оголошуються клас "TForml" "і змінна" "Абсолl" "мовою програмування Delphi:

type
TForml = class(TForm)
Buttonl: TButton;
procedure ButtonlClick(Sender: TObject);
end;
var
Forml: TForml;


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

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

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

Об "єкт 1

Об 'єкт 2

модель: Ваз 2107

модель: Ваз 2109


паливо: Бензин

паливо: Дизель

колір: Червоний

колір: Зелений

метод запуску двигуна: Start ()


метод запуску двигуна: Start ()

метод гальмування: Break ()

метод гальмування: Break ()

метод прискорення: Acceleration ()

метод прискорення: Acceleration ()

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

Класи ОВП складаються з елементів різних типів:

  1. Поля даних: зберігають стан класу за допомогою змінних і структур.
  2. Методи: підпрограми для маніпулювання вказаними даними.
  3. Деякі мови допускають третій тип - властивості. Це щось середнє між першими двома.

Методи

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

Існує безліч методів. Їхня підтримка залежить від мови. Одні створюються і викликаються кодом програміста, інші (спеціальні, такі як конструктори, деструктори і оператори перетворення) створюються і викликаються згенерованим компілятором кодом. Мова може дозволити програмісту визначати ці спеціальні методи.

Інтерфейс

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

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

  • Солдата (з поведінкою "" стріляй у противника ").
  • Чоловіка (з поведінкою "" люби свою дружину ").
  • Платника податків (з поведінкою "" плати податки "") тощо.

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

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

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

Конструктор

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

Наступний приклад пояснює концепцію конструктора класу C++ (поширеною мовою програмування):

#include <iostream>
using namespace std;
class Line {
public:
void setLength( double len );
double getLength( void );
Line(); // Объявление конструктора
private: double length;
};
// Определение функций, включая конструктор
Line::Line(void) {
cout << ""Объект создан"" << endl;
}
void Line::setLength( double len ) {
length = len;
}
double Line::getLength( void ) {
return length;
}
// Тело программы
int main() {
Line line;
// Длина строки
line.setLength(6.0);
cout << ""Length of line : "" << line.getLength() <<endl;
return 0;
}

Коли наведений вище код компілюється і виконується, він дає наступний результат:

Об 'єкт створено

Length of line: 6

Деструктор

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

Синтаксис для деструктора такий же, як і для конструктора, проте ім 'я класу використовується в даному випадку для нього зі знаком тильди "" ауд "" як префікс.

Наступний приклад мовою C++ пояснює поняття деструктора:

#include <iostream>
using namespace std;
class Line {
public: void setLength( double len );
double getLength( void );
Line(); // Объявление конструктора
~Line(); // Объявление деструктора
private: double length;
}
// Определение функций, включая конструктор
Line::Line(void) {
cout << ""Объект создан"" << endl;
}
Line::~Line(void) {
cout << ""Объект удален"" << endl;
}
void Line::setLength( double len ) {
length = len;
}
double Line::getLength( void ) {
return length;
}
// Тело программы
int main() {
Line line;
// Длина строки
line.setLength(6.0);
cout << ""Length of line : "" << line.getLength() <<endl;
return 0;
}

Коли наведений вище код скомпільований і виконаний, він дасть наступний результат:

Объект создан

Length of line: 6

Объект удален

У чому полягають переваги класів

Переваги організації програмного забезпечення в класи об 'єктів поділяються на три категорії:

  • Швидкий розвиток.
  • Простота обслуговування.
  • Повторне використання коду і дизайну.

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

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