Лекції, Обєктно-орієнтоване програмування, ООП.doc

29.08.2015

ООП.doc

Типова діаграма життєвого циклу проекту включає в себе наступні стадії:

— аналіз

— проектування

— реалізація

— підтримка

Основні концепції.

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

Змінна – це сутність, що має ім’я, комірка пам’яті, яка має специфічне значення і зберігає його незмінним під час виконання програми, поки вона не отримає інше значення.

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

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

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

Моделювання – процес створення моделі чогось; означає виділення важливих значущих властивостей, характеристик і відкидання всіх неважливих. Це відкидання називається абстрагированием.

Для формального опису якості властивості, ми повинні ввести його позначення. Кожен об’єкт може бути охарактеризований його властивостями. Кожне з них має значення конкретного типу.

Деякі властивості об’єкта можуть ніколи не змінювати свого значення. Коли властивість об’єкта змінює значення, ми говоримо, що об’єкт змінює свій стан.

Якщо і властивості, і їх значення двох об’єктів однакові, то ці об’єкти невиразні.

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

Об’єкти одного і того ж класу мають однакові властивості. Коли об’єкт належить конкретного класу, ми говоримо, що об’єкт – екземпляр цього класу. Для створення об’єкта необхідно точно визначити клас і заповнити всі властивості об’єкта, описані в класі, значеннями.

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

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

^ Об’єктна декомпозиція.

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

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

фізичний об’єкт (будинок, ручка, книга);

характеристика (форма літери, форма фігури);

розташування (вулиця);

абстрактне позначення (тварина, графічна фігура);

подія (зустріч, ПП);

складна сутність, що складається з інших сутностей (черга людей, список книг, матриця цілих чисел).

Кожна сутність моделюється з допомогою окремого класу.

На другий стадії відзначаються властивості, які описують об’єкти.

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

На четвертій стадії визначається реалізація кожного об’єкта.

^ Ідеї ООП: інкапсуляція та спадкування.

Об’єкт або клас це тип даних, який інкапсулює дані та операції над даними в єдиний елемент. Об’єкти це також колекції елементів даних. Але об’єкти на відміну від записів і структур містять процедури та функції які оперують над даними (вони називаються методами). Комбінація даних і функціональності в одному елементі називається інкапсуляція.

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

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

Ієрархія класів це колекція класів з їх залежностями типу «предок — нащадок».

ООП принцип – поліморфізм

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

Кожен метод може бути переоголошений в нащадку. Однак, виклик методу основного класу не викличе переобъявленный метод, незважаючи на справжній клас об’єкта.

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

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

Ця ситуація називається runtime binding. Це виконується у всіх викликають виразах, не тільки в явних.

Поліморфні методи часто використовуються для оголошення поведінки, невідомого в основному класі – для оголошення пізніше в нащадках.

^ Область дії і видимість.

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

Кожен об’єкт проектується «чорним ящиком». Це означає, що його реалізація і внутрішня частина повинні бути приховані, в той час як інтерфейс повинен бути чітко визначений. В ООП це зазвичай досягається приписуванням видимості атрибутів властивостей і методів. Коли ви оголошуєте властивість або метод, новий член класу має видимість зазначену одним із слів: private, protected, public. Видимість члена визначається доступністю для інших об’єктів і одиниць.

private член доступний тільки всередині методу цього ж класу. Вони використовуються для повного приховування властивостей і методів, які не повинні бути доступні комусь ще.

Protected член доступний всередині методів того ж класу і всіх нащадків.

Public член доступний звідусіль.

^ Події і обробники подій.

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

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

Творець події і відправник ->

Середа ->

Подію->

Диспетчер іншого об’єкта ->

Оброблювач події об’єкта.

Подія – це механізм, який пов’язує випадок з яким-небудь потоком.

1. Чисто-подієвий підхід (чисте Win32 програмування)

2. Процедурно-подієвий підхід (CBuilder, Delphi)

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

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

Традиційно віконна процедура містить величезну кількість операторів вибору з записами для кожного повідомлення, яке повинно обробляти вікно.

Види подій, які можуть статися, можуть бути розділені на дві головні категорії: користувальницькі події і системні події. Користувальницькі події – дії, що виконуються користувачем. Ці події завжди пов’язані з діями користувача. Системні події – події, які ОС здійснює для вас.

^ Множинне спадкування і інтерфейси.

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

Іншим рішенням буде оголошення нащадка від двох класів. Це називається множинним спадкуванням. При множинному успадкуванні нащадок успадковує всі методи і властивості всіх своїх предків.

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

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

^ Обробка виключень в ООП.

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

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

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

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

Щоб створити об’єкт винятку, програмісту потрібно викликати конструктор класу винятків оператором raise (throw).

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

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

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

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

Коли виникає помилка, додаток викликає виключення. Існує 2 найбільш загальних моделі відповіді на помилки: виконання очищаючого коду і обробка винятку. Найпростіший спосіб відповісти на виняток – гарантувати, що минає деякий очищаючий код. Цей тип відповіді не виправляє умова, що викликала помилку, але дозволяє вам бути впевненим, що ваш додаток не залишить свою середу в нестабільному стані.

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

^ Життєвий цикл об’єктів і управління пам’яттю.

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

Синтаксичний підхід реалізує метод управління пам’яттю об’єкта в мові.

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

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

^ Автоматичне керування пам’яттю.

Техніка автоматичного керування пам’яттю дозволяє програмісту передавати відповідальність за керування пам’яттю мови.

Автоматичні об’єкти викликають конструктори і деструктори, коли виконання входить у блок або залишає його відповідно.

Техніка підрахунку посилань дозволяє знищувати об’єкти автоматично, коли ніхто більше не посилається на цей об’єкт. Об’єкт існує, поки хоча б хтось один на нього посилається.

^ Об’єктний рефакторинг.

Рефакторинг зазвичай застосовується на рівні вихідного коду. Програмний рефакторинг – це трансформація програми, яка поліпшує проект програми, не змінюючи її поведінки. Мартін Фаулер визначив рефакторинг як зміна внутрішньої структури програми з метою зробити її легше для розуміння і модифікування без зміни спостережуваного поведінки. Дієслово «refactor» означає переструктурування програми шляхом застосування серій рефакторінгу без зміни поведінки.

Рефакторинг часто асоціюється з:

безліччю малих змін, що застосовуються повторно;

каталогом широко обговорюваних дій;

явними одиничними тестами, застосовуваними до і після кожного мінімального зміни;

Основні рефакторинги.

Перейменування методу.

Інкапсуляція поля (зробити public поля private полями, надати доступ за допомогою функцій).

Виділення класу є клас, який виконує роботу, яка повинна виконуватися двома. Створіть новий клас і перенесіть відповідні поля у нього).

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

Інлайн метод (якщо тіло методу зрозуміло з його назви, то перенесіть тіло методу в тіло його виклику, а метод видалите).

Витягування методу (ви маєте методи з ідентичними результатами в підкласах. Створіть такий метод в суперклассе, а в підкласах видалите).

Вштовхування методу (поведінка суперкласу суттєво тільки для деяких підкласів. Перенесіть метод в ці підкласи).

Згортання ієрархії (якщо суперклас і підклас відрізняються не сильно, з’єднайте їх).

Виділення методу (якщо ви маєте фрагмент коду, який робить дві різні речі, виділіть фрагмент метод з ім’ям, що пояснює мету нового методу).

Заміщення масиву об’єктом (якщо ви маєте масив, в якому якісь елементи означають різні речі, замініть масив на об’єкт, який має поля для кожного елемента).

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

^ Шаблони проектування.

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

Короткий опис статті: об’єктно орієнтоване програмування Назва: Лекції — Об’єктно-орієнтоване програмування; Файл: ООП.doc; Дата: 27.01.2006 14:17; Розмір: 126kb. документи, навчальний матеріал, школярі, студенти, абітурієнти, лекції, навчання, освіта

Джерело: Лекції — Об’єктно-орієнтоване програмування — ООП.doc

Також ви можете прочитати