Абстракція програмування, уроки і приклади

Глава 2. Об'єктно-орієнтоване програмування в Java

абстракція

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

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

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

Опис кожної моделі проводиться у вигляді одного або декількох класів (classes). Клас можна вважати проектом, зліпком, кресленням, за яким потім будуть створюватися конкретні об'єкти. Клас містить опис змінних і констант, що характеризують об'єкт. Вони називаються полями класу (class fields). Процедури, які описують поведінку об'єкта, називаються методами класу (class methods). Усередині класу можна описати і вкладені класи (nested classes) і вкладені інтерфейси. Поля, методи і вкладені класи першого рівня є членами класу (class members). Різні школи об'єктно-орієнтованого програмування пропонують різні терміни, ми використовуємо термінологію, прийняту в технології Java.

Ось начерк опису автомобіля:

int maxVelocity; // Поле, що містить найбільшу швидкість автомобіля

int speed; // Поле, що містить поточну швидкість автомобіля

int weight; // Поле, що містить вагу автомобіля

void moveTo (int x, int у)

// автомобіля. Параметри х і у - чи не поля

int а = 1; // Локальна змінна - не поле

// Тіло методу. Тут описується закон

// переміщення автомобіля в точку (х, у)

У Java немає вкладених процедур і функцій, в тілі методу не можна описати інший метод.

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

Automobile Iada2110, fordScorpio, oka;

lada2110 = new Automobile ();

fordScorpio = new Automobile ();

oka = new Automobile ();

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

Оскільки імена полів, методів і вкладених класів у всіх об'єктів однакові, вони задані в описі класу, їх треба уточнювати ім'ям посилання на об'єкт:

oka.maxVelocity = 350; // Чому б і ні?

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

int strlen = "Це об'єкт класу String" .length ();

Об'єкт "рядок" виконує метод length (). один з методів свого класу string. підраховує число символів в рядку. В результаті отримуємо значення strlen. рівне 24. Подібна дивна запис зустрічається в програмах на Java на кожному кроці.

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

Чи не здається вам, що клас Automobile сильно перевантажений? Дійсно, в світі випущені мільйони автомобілів різних марок і видів. Що між ними спільного, крім чотирьох коліс? Та й коліс може бути більше або менше. Чи не краще написати окремі класи для легкових і вантажних автомобілів, для гоночних автомобілів і всюдиходів? Як організувати все це безліч класів? На це питання об'єктно-орієнтоване програмування відповідає так: треба організувати ієрархію класів.

Схожі статті