Java ООП

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

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

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

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

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

Об'єктно-орієнтований підхід володіє такими перевагами, як:

- зменшення складності програмного забезпечення;

- підвищення надійності програмного забезпечення;

- забезпечення можливості модифікації окремих компонентів програмного забезпечення без зміни останніх його компонентів;

- забезпечення можливості повторного використання окремих компонентів програмного забезпечення.

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

Об'єкти.

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

- розуміння прикладного завдання (проблеми);

- введення основи для реалізації на комп'ютері.

Приклади об'єктів: кватирка, Банк "Імперіал", Петро Сидоров, справа № 7461, ощадкнижка і так далі. Кожен об'єкт має певний час життя. В процесі виконання програми, або функціонування якої-небудь реальної системи, можуть створюватися нові об'єкти і знищуватися що вже існують.

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

Стан.

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

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

- поточне положення людини (стоїть, сидить, лежить);

- наявність вудки (є чи ні).

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

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

Поведінка.

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

Наприклад, можливі дії з деяким файлом операційної системи ПК:

- створити;

- відкрити;

- читати з файлу;

- писати у файл;

- закрити;

- видалити.

Результат виконання дій залежить від стану об'єкту на момент здійснення дії, тобто не можна, наприклад, видалити файл, якщо він відкритий ким-небудь (заблокований). В той же час дії можуть міняти внутрішній стан об'єкту - при відкритті або закритті файлу властивість "відкритий" набуває значень "та чи ні", відповідно.

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

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

Поведінка (behavior) - дії і реакції об'єкту, виражені в термінах передачі повідомлень і зміни стану; видима ззовні і відтворна активність об'єкту. Унікальність. Унікальність - це те, що відрізняє об'єкт від інших об'єктів. Наприклад, у вас може бути декілька однакових монет. Навіть якщо абсолютно всі їх властивості (атрибути) однакові (рік випуску, номінал і так далі) і при цьому ви можете використовувати їх незалежно одна від одної, вони як і раніше залишаються різними монетами.

У машинному уявленні під параметром унікальності об'єкту найчастіше розуміється адреса розміщення об'єкту в пам'яті.

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

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

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

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

Відповідно до UML (Unified Modelling Language - уніфікована мова моделювання), клас має наступне графічне уявлення.

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

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

- конструктор (constructor) - виконується при створенні об'єктів;

- деструкція (destructor) - виконується при знищенні об'єктів.

Зазвичай конструктор і деструкція мають спеціальний синтаксис, який може відрізнятися від синтаксису, використовуваного для написання звичайних методів класу. Інкапсуляція. Інкапсуляція (encapsulation) - це заховання реалізації класу і відділення його внутрішнього уявлення від зовнішнього (інтерфейсу). При використанні об'єктно-орієнтованого підходу не прийнято застосовувати прямий доступ до властивостей якого-небудь класу з методів інших класів. Для доступу до властивостей класу прийнято задіювати спеціальні методи цього класу для отримання і зміни його властивостей. Усередині об'єкту дані і методи можуть володіти різним ступенем відвертості (або доступності). Ступені доступності, прийняті в мові Java, детально будуть розглянуті в лекції6. Вони дозволяють тонше управляти властивістю інкапсуляції. Відкриті члени класу складають зовнішній інтерфейс об'єкту. Це та функціональність, яка доступна іншим класам. Закритими зазвичай оголошуються всі властивості класу, а також допоміжні методи, які є деталями реалізації і від яких не повинні залежати інші частини системи.

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

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

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

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

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

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

Поліморфізм є одним з фундаментальних понять в об'єктно- орієнтованому програмуванні ряду із спадкоємством і інкапсуляцією. Слово "поліморфізм" грецького походження і означає той, що "має багато форм". Щоб зрозуміти, що воно означає стосовно об'єктно-орієнтованого програмування, розглянемо приклад. Припустимо, ми хочемо створити векторний графічний редактор, в якому нам потрібно описати у вигляді класів набір графічних примітивів, - Point, Line, Circle, Box і так далі. У кожного з цих класів визначимо метод draw для відображення відповідного примітиву на екрані. Очевидно, доведеться написати код, який при необхідності відобразити малюнок послідовно перебиратиме всі примітиви, на момент відсортування, що знаходяться на екрані, і викликати метод draw у кожного з них. Людина, незнайома з поліморфізмом, найімовірніше, створить декілька масивів (окремий масив для кожного типу примітивів) і напише код, який послідовно перебере елементи з кожного масиву і викличе у кожного елементу метод draw.

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

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

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

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

- агрегація (Aggregation);

- асоціація (Association);

- спадкоємство (Inheritance);

- метакласи (Metaclass).

На початок курсу