Більшість технологій, які включають програмування, на перший погляд здаються неймовірною магією, а насправді створені на стику математики і електроніки. Обидві ці складові окремо - абсолютно марні.
Без ПО найпотужніший комп'ютер - просто купа миготливого і гуде мотлоху. Точно також і програмне забезпечення - ви можете роздрукувати його і навіть записати кульковою ручкою. Може бути навіть ваші записи будуть непогано виглядати, але без комп'ютера вони залишаться просто безглуздими карлючками.
Але поки у нас є наші рідні ПК, що працюють в двійковому коді, програм буде тільки більше і вони будуть ставати тільки складніше. Так що давайте їх вивчати - повірте, стане в нагоді.
Об'єктно-орієнтоване програмування - найпотужніший інструмент розробника. Писати на сучасних мовах набагато зручніше, ніж, припустимо, на мові C. Наприклад, для того щоб вивести користувачеві ціле число, а не дріб, яка «крутилася» в рівнянні, мені довелося трохи подумати. І написав я ось що:
Припустимо, у нас є якась змінна y, куди ми передали дробове значення:
float y = 2.0
Перевірити, ціле це число чи ні ми повинні простими засобами. Для цього створимо порожню змінну x, инициализируем її нулем і напишемо такий код:
float a = y;
int x = 0;
x = (int) y;
y - = x;
if (x == 0) printf ( "Наша змінна дорівнює.", x);
>
else printf ( "Наша змінна дорівнює% f", a);
>
Ми зробили дуже просту річ - привели дані до цілого виду, а потім забрали від нашої дробу. Потім написали умова, за яким у разі відсутності реального залишку користувач побачить замість дробу ціле число. Цей маленький «хак» працює, але не в кожному випадку під рукою є просте і ефективне рішення.
Об'єктно-орієнтоване програмування звільнився від цих клопотів. Там найчастіше більшість технологій представлено в готовому вигляді. Так, наприклад, в мові Java легко перевірити коректність введення методом parseInt з класу Integer пакета Java.lang. При введенні нецілого числа або взагалі чого завгодно, програма видасть помилку (виняток), яку програмісту необхідно обробити належним чином - помістити туди фразу «ви допустили помилку», перекинути користувача назад до вікна введення або навіть дати йому ще кілька пробних спроб. Але, власне, ми сьогодні не про це, а про «чарівність».
Справжнісіньким дивом в ООП є той факт, що програму можна писати не одним нескінченним лістингом, як в C, а розбити її на файли і блоки - класи і методи. Це просто здорово. Адже в одному класі ми можемо зберігати запускає функцію main, в інших - методи нашої програми, по-третє - дані або інтерфейс з'єднання з БД. Але як же нам реалізувати наше диво? Не хвилюйтеся - зараз придумаємо разом.
Створимо, наприклад, клас OneClass:
public class OneClass>
І помістимо туди наші дані - кілька змінних.
public class OneClass int x = 9;
int y = 10;
int z = 11;
>
За замовчуванням ці змінні мають пакетний доступ - т. Е - все класи (файли) нашого пакета можуть ними скористатися - скопіювати, змінити, перевизначити. Але як же це зробити? А дуже просто - створити екземпляр нашого класу OneClass в іншому класі або після методу main.
OneClass cl = new OneClass ();
Тепер ми отримали можливість користуватися всіма методами і полями класу (так називаються наші змінні, які написані відразу після імені класу і тому видно в усьому OneClass). Скопіюємо їх собі - створимо свої змінні і перекинемо туди потрібні значення:
public class TwoClass OneClass cl = new OneClass ();
int x = cl.x;
int y = cl.y;
int z = cl.z;
>
Не варто боятися однакових імен - в іншому класі вони не переплутаються з початковими. І тепер у нас є дані з класу OneClass.
Але з ними треба бути дуже обережними. Адже ми не тільки можемо взяти їх з першого класу, а й переписати їх значення. І добре, якщо ми зробимо це обдумано. А якщо просто? Непорядок. Що ж робити? Чари потребує захисту від помилки.
Мова, звичайно, піде не про заклятих Гаррі Поттера і не про «Володарі кілець». Я хочу розповісти про дивовижні методах - Геттера і сеттерів.
У минулому розділі ми з'ясували, що якщо наші дані відкриті для іншого класу - це не дуже добре. Адже ми (або хтось інший) можемо ненавмисно змінити їх при використанні, просто створивши власний клас і записавши там відповідні інструкції. І об'єкт, клас для якого ми так ретельно створювали, може отримати такі параметри, що перетвориться на справжнісінького орка з «Володаря кілець».
Щоб цього уникнути, ми зробимо ось що: пріпішем до кожної змінної ідентифікатор, який заборонить її використання скрізь, крім власного класу.
private x = 9;
private y = 10;
private z = 11;
Тепер ніхто з боку не зможе наші дані змінити. Це називається инкапсуляцией. Ну а для нас поки це - диво. Спробуємо в ньому розібратися.
Щоб створити новий об'єкт, нам самим, іншим програмістам або іншим частинам програми, все одно буде потрібно отримати дані з нашого класу. І що ж тоді робити? Адже вони закриті? Саме для цих випадків і потрібні геттери. Але це диво ми повинні створювати самі, прописавши всю логіку цих методів. Get - значить «читати». Щоб прочитати наші дані в іншому класі, потрібно їх скопіювати і передати.
У класі OneClass напишемо, наприклад, для змінної x метод-геттер такого змісту:
public int getX () return x;
>
У класі TwoClass викликаємо цей метод:
class cl = new class ();
cl. getX ();
Чи можемо надрукувати наше вираз і переконатися, що отримана саме наша змінна.
System.out.println (cl. GetX ());
Можна і записати щось потрібне в змінну класу. Для цього буде потрібно сетер.
public void setY (newY) y = newY;
>
Напис, private int y = 10; залишиться на своєму місці. Але отримати з надр класу можна буде тільки те значення, яке записано в newY. Магія - та й годі!
За допомогою сеттерів ми можемо, наприклад, легко «приструнити» користувача, приймаючи лише числа більше нуля і менше 10. Для цього в сетер потрібно записати нескладну логіку:
public void setY (newY) if (newY> 0 newY<10) y = newY;
>
Конструктор - ще одна магічна одиниця ООП. Його видно при створенні нового об'єкта класу - наприклад, OneClass cl = new OneClass (); Круглі дужки якраз і приховують конструктор. Правда, в нашому випадку він не має параметрів, оскільки створюється автоматично. Значить, що змінних у нашого об'єкта може бути будь-яка кількість всіх типів. Але якщо ми напишемо свій конструктор, то об'єкт не тільки буде прив'язаний до якихось параметрах, які не можна змінити, але і може отримати початкові значення.
Припустимо, ігровий юніт «дракон» по нашим задумом повинен володіти швидкістю, висотою польоту, часом знаходження в повітрі і повинен мати кілька абстрактних одиниць сили. Створимо відповідний клас і конструктор:
public class Dragon Dragon () int speed = 120;
int flight_altitude = 1000;
int timeAir = 7;
int power = 10;
>
>
Отже, у нас є дракон, який може мчати зі швидкістю 120 кілометрів на годину на висоті 1000 метрів цілих сім хвилин! До того ж, він має 10 одиницями сили, а це значить, що його противник повинен буде дуже довго з ним боротися.
Ось так легко ми створили свого власного дракона і ініціалізували його по-справжньому чарівними властивостями. Додати йому вже нічого не можна, так як якщо конструктор з параметрами написаний, то порожній сам по собі не створюється. Але ті властивості, що ми додали дракону, відняти неможливо. Тепер з нашим конструктором можна створювати цілі полчища драконів, які розчистять нам шлях до скарбів. Чудеса!
Але і це - ще не все. І конструктори, і методи підтримують так звану перевантаження - то ще диво. Припустимо, нам потрібно створити з нашого класу Dragon не тільки дракона, а ще й «берсеркера». У нього не буде висоти і часу польоту - а швидкість і сила залишаться. Другий конструктор буде таким:
Dragon (int v, int c)>
У класі, де буде розташований метод main для всіх ігрових юнітів, инициализируем нові змінні іншими значеннями і додамо їх в новий об'єкт:
int speed = 60;
int power = 7;
Dragon berserker = new Dragon (speed, power);
Ап! У нас з'явився берсеркер!
Ще одне маленьке диво «на закуску». Якщо у нас в класі вже є поля x, y, z, то в своєму конструкторі або методі ми цілком можемо створити такі ж змінні з тими ж іменами і передати їм значення полів. Причому наші змінні не переплутаються. Для цього тільки потрібно вставити перед ними маленьке слово з точкою, ось так: this.
int x = 4;
int y = 6;
int z = 12;
Dragon (int v, int c, int z) this.x = x;
this.y = y;
this.z = z;
>
У програмуванні повно речей, які можна назвати якщо і не магічними, то вже чудовими - абсолютно точно. І ці чудеса цілком під силу освоїти будь-кому.
Версія для друку