Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LECTIONS_TPSPP!!!.doc
Скачиваний:
21
Добавлен:
16.12.2018
Размер:
1.41 Mб
Скачать

Успадкування

Спадкування є важливим випадком відносин між двома або більше класами. Докладно вона розглядалася вище.

Метакласи

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

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

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

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

Отже, об'єкти породжуються від класів, а класи - від метаклассов. Він, як правило, в системі тільки один. Але існують мови програмування, в яких можна створювати і використовувати власні метакласи, наприклад мова Python. Зокрема, функціональність метаклассов може бути наступна: при формуванні класу він буде переглядати список усіх методів в класі і, якщо ім'я методу має вид set_XXX або get_XXX, автоматично створювати поле з ім'ям XXX, якщо такого не існує.

Оскільки метаклас сам є класом, то немає ніякого сенсу у створенні "мета-мета-класів".

У мові Java також є метакласи. Це клас, який так і називається - Class (описує класи), він розташовується в основний бібліотеці java.lang. Віртуальна машина використовує його за прямим призначенням. Коли завантажується черговий. Class-файл, що містить опис нового класу, JVM породжує об'єкт класу Class, який буде зберігати його структуру. Таким чином, Java використовує концепцію метаклассов в самих практичних цілях. За допомогою Class реалізована підтримка статичних (static) полів і методів. Нарешті, цей клас містить ряд методів, корисних для розробників.

Лекція 13. Шаблони проектування в ООП.

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

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

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

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

Шаблон проектування — опис взаємодії об’єктів та класів, адаптований для вирішення узагальненої задачі проектування в конкретному контексті. Як правило, це певна формалізована логічна одиниця підсистеми, яка напряму перетворюється в програмний код.

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

1. Назва. Вказавши ім’я шаблону, можна відразу описати проблему проектування, її рішення та наслідки. Присвоювання імен шаблонам дозволяє проектувати систему на більш високому рівні абстракції. За допомогою такого «словника шаблонів» можна вести дискусії з колегами, згадувати про шаблони в розробницькій документації, в деталях розуміти дизайн системи.

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

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

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

Існує три види шаблонів проектування:

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

2. Структурні шаблони. В цих шаблонах розглядається питання про те, як із класів та об’єктів утворюються більш складні структури. Структурні шаблони класового рівня використовують наслідування для формування композицій із інтерфейсів та реалізацій. Такі шаблони є корисними, коли потрібно організувати спільну роботу кількох незалежних бібліотек.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]