Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекції 2012-2013ооп.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
6.61 Mб
Скачать

1.1. Поняття те визначення ооп.

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

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

Існує три основні принципи:

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

Інкапсуляція

Поліморфізм

Останнім годиною розвиток апаратних засобів істотно випереджав розвиток систем і засобів програмування. Щоб виправити положення, в 70-80-х роках булі запропоновані різні підходи до збільшення продуктивності праці програміста. Серед цих спроб виділяється такий напрям, як об' єктно - орієнтований підхід до конструювання і кодування програм. Особливу роль в популярності цього підходу зіграло як його тісний зв'язок з інтерфейсами користувача (особливо графічними), так і включення елементів цього підходу в популярні (на персональних комп'ютерах фірми IBM) реалізації гібридних мов програмування C++ і Pascal with Objects фірми Borland.

До цих пір більшість використовуваних програмних систем побудовані на принципах структурного підходу, суть якого полягає в декомпозиції системи на ряд модулів, процедур, функцій і структур даних, зв'язаних загальним алгоритмом функціонування. Але розповсюдження могутніх персональних комп' ютерів (порівнянних з робочими станціями 70-80-х років) створило в 90-х роках основу для широкого застосування об' єктно - орієнтованого підходу на практиці. Останнім часом ширше починають використовуватися мови програмування, створені у рамках об' єктно - орієнтованої методології, такі як Smalltalk і Java.

1.2. Об' єктно - орієнтована методологія (оом).

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

· автоматизація експерименту, робототехника;

· планування;

· інтерфейс користувача, анімація;

· комунікації, зв'язок;

· медицина, експертні системи;

· обробка комерційної інформації;

· операційні системи;

· системи управління;

· тренажери, моделювання.

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

Такий підхід дозволяє локалізувати ухвалювані рішення рамками об' єкту, об' єднуючи в нім і структуру, і поведінку, а, отже, знижуючи складність окремої програми (що реалізовує об' єкт). Ця ідея об' єднання структури і поведінки в одному місці і заховання всіх даних усередині об' єкту, що робить їх невидимими для всіх, за винятком методів самого об' єкту називається інкапсуляцією. Це дозволяє об' єктам функціонувати абсолютно незалежно один від одного, приховуючи за інтерфейсом деталі реалізації. Інкапсуляція дозволяє розглядати об' єкти, як ізольовані "чорні ящики", які знають і уміють виконувати певні дії. З цієї точки зору, внутрішній устрій "Чорних ящиків" для нас значення не має, нам усе одне, що відбувається усередині. Важливо тільки знаті, що треба покласти в ящик при зверненні до нього і що мі при цьому з нього отримаємо. Таким чином, об' єкти об' єктно - орієнтованих систем - це мінімальні одиниці інкапсуляції. Але як управляти таким обсягом об' єктів, коли їх стало досить багато? Адже багато хто з них буде дуже сильно відрізнятися один від одного, а інші об' єкти будуть дуже схожі один на одного. Тут на сцену виходить одна з ключових концепцій об' єктно - орієнтованого програмування - ідея угрупування об' єктів в класи, відповідно до того як смороду влаштовані і діють. Така ідея вперше була реалізована ще в 60 - і роки в мові Simula. Під класом розуміється безліч об' єктів, зв'язаних спільністю структури і поведінки. Клас можна порівняти з шаблоном, по якому створюються об' єкти. Саме клас спочатку описує змінні і методи об' єкту, тобто структуру і поведінку об' єкту, і визначає механізми створення об' єкту, що реально існує в системі, який, коли створюється, є екземпляр класу.

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

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

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

Абстрагування.

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

Обмеження доступу.

Процес захисту окремих елементів об' єкту, що не зачіпає істотних характеристик об' єкту, як цілого.

Модульність.

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

Існування ієрархій.

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

Модульність - це розподіл програми на окремо компільовані фрагменти, які мають між собою засоби зв'язку.

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

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

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

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

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

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

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

У процесі поділу системи на модулі можуть бути корисними два правила.

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

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

Ієрархія

Ієрархія - це ранжована чи впорядкована система абстракцій. Основні відіа ієрархічних структур стосовно складних систем такі :

Структура класів (ієрархія за номенклатурою).

Структура об' єктів (ієрархія за складом).

Приклади ієрархії

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

А. Просте успадкування.

Розглянемо, наприклад, різноманітні відіа рослин, які вирощуються в теплиці.

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

class StundartFruitGrowingPlan: public GrowingPlan

{

public:

StundartFruitGrowingPlan ();

StundartFruitGrowingPlan (const StundartFruitGrowingPlan &);

virtual StundartFruitGrowingPlan ();

virtual int daysUntilHarvest (day currentDay) count;

private:

day timeToHarvest;

};

Із наведеного прикладу бачимо, що клас StundartFruitGrowing - Plan точно повторює свій суперклас GrowingPlan за кількома ви-нятками. У підклас введень новий елемент структури (timeTo - Harvest), змінені конструктор та деконструктор, додана віртуальна функція (daysUntilHarvest). Використовуючи цей новий клас вже як суперклас, можна визначити ще більш спеціалізовані підкласи, наприклад для плану вирощування яблук.

Б. Множинне успадкування.

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

Щоб реалізувати зазначені вимоги, необхідно з даного класу утворити два нових класи:

FloweringPlant та Fruit/VegetablePlant.

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

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

Типізація

Концепція типізації грунтується на понятті типів абстрактних даних.

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

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

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

Розглянемо переваги строго типізованих мов.

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

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

3. Декларування типів спрощує документування програм.

4. Багато з компіляторів дозволяють генерувати ефективніший код при явному визначенні типів.

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

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

Ця властивість є найістотнішою в об' єктно - орієнтованому програмуванні разом із властивістю реалізації абстракцій.

Паралелізм

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

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

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

У С++ паралельні об' єкти можуть бути реалізовані в системі викликом fork.

Стійкіcть

Будь-який об' єкт у програмі посідає певне місце та існує протягом певного годині.

Існують гіпотези про способи існування об' єктів. Цей спектр визначає і рівні стійкості останніх.

1. Проміжні результати обчислення виразів.

2. Локальні зміни у виклику процедур.

3. Власні зміни, глобальні зміни та головні елементи.

4. Дані, які зберігаються між викликами основної програми.

5. Дані, які залишаються без змін у різних версіях програми.

6. Дані, які існують до кінця життя програми.

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

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

Об'єкти. Атрибути, методи, властивості

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

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

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

Дані об'єкта називають атрибутами.

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

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

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

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

Реалізацію (інтерпретацію) операції над об'єктом називають методом.

Тим самим у термінології підкреслюється різниця між поняттям операції над даними (що зробити) і поняттям методу (як зробити).

Семантичну одиницю програми, оформлену відповідно до синтаксису об’єктно-орієнтованої системи програмування як метод, включають в опис об'єктного типу.

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

Рис 2.1. Об'єкт як об'єднання даних і операцій

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

Процедури, таким чином, лише передають одна одній потоки даних.

Методологія ООП ж, навпаки, основана на строгому застосуванні принципу інкапсуляції, тобто обєднання в єдине ціле даних та методів їх опрацювання.