You are on page 1of 7

1

7.3 Головні елементи об'єктно-орієнтованої моделі

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

Рис. 7.2 – Абстракція фокусується на суттєвих з точки зору


спостерігача характеристиках об'єкта.

Ключова абстракція — це клас або об'єкт, який входить в словник проблемної


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

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

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

Рис. 7.3 – Інкапсуляція приховує деталі реалізації об'єкта.

Візьмемо для прикладу структуру рослини: щоб зрозуміти взагалі дію


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

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


зобов'язання абстракції від їх реалізації.

7.3.3 Модульність
Поділ програми на модулі деякою мірою дозволяє зменшити її складність. Однак,
набагато важливішим є той факт, що всередині модульної програми створюється множина
добре визначених і документованих інтерфейсів. Ці інтерфейси дуже важливі для
вичерпного розуміння програми в цілому.
Модульність — це властивість системи, яка була розкладена на внутрішньо
зв'язані, але слабо пов'язані між собою частини.
Таким чином, на практиці, модульність — це поділ програми на фрагменти, які
компілюються окремо, але можуть встановлювати зв'язки з іншими модулями. Або
інакше: зв'язки між модулями — це їхні уявлення один про одного.
Для мов C/C++ традиційним є розміщення інтерфейсної частини модулів в окремі
файли з розширенням .h (так звані заголовкові файли). Реалізація, тобто текст модуля,
зберігається в файлах з розширенням .с або .срр. Зв'язок між файлами встановлюється
директивою макропроцесора #include. Такий підхід будується виключно за домовленістю і
не є суворою вимогою самої мови.
Слід пам'ятати, що безсистемний розподіл програми на модулі набагато гірший,
ніж відсутність модульності взагалі. Необхідно знаходити баланс між двома
протилежними тенденціями: прагненням приховати інформацію і необхідністю
забезпечення видимості тих чи інших абстракцій в декількох модулях.

Рис. 7.4 – Модульність дозволяє зберігати абстракції окремо.

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


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

Інкапсуляція дозволяє в якійсь мірі усунути цю перешкоду, прибравши з поля зору


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

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

Рис. 7.5 – Абстракції утворюють ієрархію.

Основними видами ієрархічних структур стосовно до складних систем є структура


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

7.4 Додаткові елементи об'єктно-орієнтованої моделі

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

Рис.7.6 – Сувора типізація запобігає змішуванню абстракцій.

Наприклад, візьмемо фізичні одиниці виміру. Ділячи відстань на час, ми очікуємо


отримати швидкість, а не вагу. У множенні температури на силу сенсу немає, а в
множенні відстані на силу — є. Все це приклади сильної типізації, коли прикладна
область накладає правила і обмеження на використання та поєднання абстракцій.
Конкретна мова програмування може мати сильний чи слабкий механізм типізації, і
навіть не мати взагалі ніякого, залишаючись об'єктно-орієнтованою.
Важливі переваги строго типізованих мов програмування:
 відсутність контролю типів може призводити до загадкових збоїв в програмах під
час їх виконання;
 в більшості систем процес «редагування-компіляція-налагодження» стомлює, і
раннє виявлення помилок просто незамінне;
 об'ява типів покращує документування програм.
На практиці, багато які компілятори генерують більш ефективний об'єктний код,
якщо їм явно відомі типи.
6

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

Рис. 7.7 – Паралелізм дозволяє різним об'єктам діяти одночасно.

Реальна паралельність досягається тільки на багатопроцесорних системах, а


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

7.4.3 Зберігання
Зберігання — здатність об'єкта існувати в часі, переживаючи процес що його
породив, і (або) в просторі, з переміщенням зі свого первісного адресного простору в
інше. Будь-програмний об'єкт існує в пам'яті і живе в часі. Є безперервна множина
тривалості існування об'єктів: частка об'єктів присутня лише під час обчислення виразу,
але є і такі, як бази даних, які існують незалежно від програми.
7

Спектр зберігання об'єктів охоплює (в порядку зростання протяжності існування):


1) проміжні результати обчислення виразів;
2) локальні змінні у викликах процедур і функцій;
3) власні змінні, глобальні змінні і дані що створюються динамічно;
4) дані, що зберігаються між сеансами виконання програми;
5) дані, що зберігаються при переході на нову версію програми;
6) дані, які переживають програму.
Традиційно, першими трьома рівнями займаються мови програмування, а
останніми — бази даних.

Висновки

1) Ключові абстракції відображають словник предметної області; їх знаходять або в


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

You might also like