Технологія об'єктно-орієнтованого програмування


3.3.1. Об'єктно-орієнтований підхід

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

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

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

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

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

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

3.3.2. Основні поняття об'єктно-орієнтованого програмування

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

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

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

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

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

Об'єкт, як логічна одиниця, має такі дані та операції (методи з кодом алгоритму) в окремій ділянці пам'яті:

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

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

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

3.3.3. Принципи об'єктно-орієнтованого програмування

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

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

Принцип інкапсуляції використовувався в технології модульного програмування. У модулі в явній формі введена інкапсуляція шляхом поділу його на секції інтерфейсу і реалізації.

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

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

type
TMyClass = class
IntField: Integer;
function MyFunc (a: Integer): Integer;
procedure MyProc; end;

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

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

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

Принцип успадкування оперує з поняттями "предок - нащадок" і передбачає розширення набору властивостей нащадка за рахунок прийняття всіх властивостей предка.

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

TChildCIass = class (TParentClass)

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

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

TaClass = class (TObject) <==> TaClass = class

Принцип успадкування призводить до створення розгалуженого дерева класів. Кожен нащадок доповнює можливості свого батька новими і передає їх своїм нащадкам. Наприклад, клас TPersistent збагачує можливості свого батька TObject тим, що він вміє зберігати дані у файлі й отримувати їх з нього, в результаті це вміють робити і всі його нащадки. Клас TComponent, у свою чергу, вміє взаємодіяти із середовищем розробника і передає це вміння своїм нащадкам. TControl не тільки здатний працювати з файлами і середовищем розробника, але він ще вміє створювати та обслуговувати видимі на екрані зображення, а його нащадок TWinControl може створювати Windows-вікна тощо.

У Object Pascal можливо тільки так зване одиночне спадкування, але в реальному світі у нащадка два батьки, тому в ряді мов (наприклад, в C++) передбачений механізм множинного успадкування. Множинне успадкування більш логічне з точки зору моделювання реального світу, проте, воно ускладнює реалізацію мов програмування.

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

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

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

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

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

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