1. Введення p>
Концепція об'єктно-орієнтованого програмування на увазі,що основою управління процесом реалізації програми є передачаповідомлень об'єктам. Тому об'єкти повинні визначатися спільно зповідомленнями, на які вони повинні реагувати при виконанні програми. Уцьому полягає головна відмінність ООП від процедурного програмування, деокремо визначені структури даних передаються до процедури (функції) уЯк параметри. Таким чином, об'єктно-орієнтована програмаскладається з об'єктів - окремих фрагментів коду, що обробляє дані,які взаємодіють один з одним через певні інтерфейси. p>
Об'єктно-орієнтована мова програмування повинна володітинаступними властивостями: p>
1. абстракції - формальне про якості або властивості предмета шляхом уявного видалення деяких деталей або матеріальних об'єктів; p>
2. інкапсуляції - механізму, що зв'язує вмести код і дані, якими він маніпулює, і захищає їх від зовнішніх перешкод і некоректного використання; p>
3. успадкування - процесу, за допомогою якого один об'єкт набуває властивостей іншого, тобто підтримується ієрархічної класифікації; p>
4. поліморфізму - властивості, що дозволяє використовувати один і той же інтерфейс для загального класу дій. p>
Розробка об'єктно-орієнтованих програм складається з наступнихпослідовних робіт: p>
- визначення основних об'єктів, необхідних для вирішення даного завдання; p>
- визначення закритих даних (даних стану) для вибраних об'єктів; p>
- визначення другорядних об'єктів і їх закритих даних; p>
- визначення ієрархічної системи класів, що представляють вибрані об'єкти; p>
- визначення ключових повідомлень, які повинні обробляти об'єкти кожного класу; p>
-- розробка послідовності виразів, які дозволяють вирішити поставлену задачу; p>
- розробка методів, які обробляють кожне повідомлення; p>
- очищення проекту, тобто усунення всіх допоміжних проміжних матеріалів, що використовувалися при проектуванні; p>
- кодування, налагодження, компонування і тестування. p>
Об'єктно-орієнтоване програмування дозволяє програмістумоделювати об'єкти певної предметної області шляхом програмуванняїх утримання і поведінки в межах класу. Конструкція «клас»забезпечує механізм інкапсуляції для реалізації абстрактних типів даних.
Інкапсуляція як би приховує і подробиці внутрішньої реалізації типів, ізовнішні операції та функції, допустимі для виконання над об'єктами цьоготипу. p>
2. Що таке об'єктно-орієнтоване програмування p>
Елементи об'єктно-орієнтованого програмування (ООП) з'явилися впочатку 70-х років в мові моделювання Симула, потім отримали своєрозвиток, і в даний час ООП належить до числа провідних технологійпрограмування. p>
Основна мета ООП, як і більшості інших підходів допрограмування - підвищення ефективності розробки програм. Ідеї ООПвиявилися плідними і знайшли застосування не тільки в мовахпрограмування, але і в інших областях Computer Science, наприклад, угалузі розробки операційних систем. p>
Поява ООП було пов'язано з тим спостереженням, що комп'ютерніпрограми являють собою опис дій, які виконуються над різнимиоб'єктами. У ролі останніх можуть виступати, наприклад, графічні об'єкти,записи в базах даних або сукупності числових значень. У традиційнихметоди програмування зміна даних або правил і методів обробкичасто призводило до необхідності значного зміни програми. Усякеістотне зміни програми - це велика неприємність дляпрограміста, тому що при цьому збільшується ймовірність помилок, внаслідокчого зростає час, необхідний для «доведення» програми. Використання
ООП дозволяє вийти з такої ситуації з мінімальними втратами, зводячинеобхідну модифікацію програми до її розширення і доповнення. Необхіднопомітити, що ООП не є панацеєю від всіх бід програмістських, але йогоцінність як передової технології програмування безсумнівна. Вивченняідей і методів ООП може істотно спростити розробку і налагодження складнихпрограм. p>
Ми вже звикли використовувати у своїх програмах процедури та функціїдля програмування тих складних дій з обробки даних, якідоводиться виконувати багаторазово. Використання підпрограм свого часубуло важливим кроком на шляху до підвищення ефективності програмування.
Підпрограма може мати формальні предмети, які при зверненні до неїзамінюються фактичними предметами. У цьому випадку є небезпека викликупідпрограми з неправильними даними, що може призвести до збою програми іїї аварійного завершення при виконанні. Тому природним узагальненнямтрадиційного підходу до програмування є об'єднання даних іпідпрограм (процедур і функцій), призначених для їх обробки. p>
3. Об'єкти p>
Базовим в об'єктно-орієнтованому програмуванні є поняттяоб'єкта. Об'єкт має певні властивості. Стан об'єкта задаєтьсязначеннями його ознак. Об'єкт «знає», як вирішувати певні завдання,тобто має у своєму розпорядженні методами рішення. Програма, написана звикористанням ООП, складається з об'єктів, які можуть взаємодіятиміж собою. p>
Раніше зазначалося, що програмна реалізація об'єкта представляєсобою об'єднання даних та процедур їх обробки. Змінні об'єктноготипу називають примірниками об'єкта. Тут потрібне уточнення - примірникможна лише формально назвати змінної. Його опис дається в пропозиціюопису змінних, але в дійсності екземпляр - щось більше, ніжзвичайна змінна. p>
На відміну від типу «запис», об'єктний тип містить не лише поля,описують дані, а також процедури та функції, опису якихміститься в описі об'єкта. Ці процедури і функції називають методами.
Методам об'єкта доступні його поля. Слід зазначити, що методи і їхпараметри визначаються в описі об'єкта, а їх реалізація дається поза цимопису, у тому місць програми, що передує викликом даного методу.
В описі об'єкта фактично міститися лише шаблони звернення до методів,які необхідні компілятору для перевірки відповідності кількостіпараметрів та їх типів при зверненні до методів. Ось приклад описуоб'єкта [1]: p>
Type p>
Location = object p>
X, Y: Integer; p>
Procedure Init (InitX, InitY: Integer); p>
Function GetX: Integer; p>
Function GetY: Integer; p>
End; p>
Тут описується об'єкт, який може використовуватися надалі,скажімо, в графічному режимі і який призначений для визначенняположення на екрані довільного графічного елементу. Об'єкт описуєтьсяза допомогою зарезервованих слівobject ... end, між якими перебувати опис полів і методів. У нашомуприкладі об'єкт містить два поля для зберігання значень графічнихкоординат, а також для опису процедури і двох функцій - це методиданого об'єкта. Процедура призначена для завдання початковогоположення об'єкта, а функція - для зчитування його координат. p>
4. Інкапсуляція p>
Інкапсуляція є найважливішою властивістю об'єктів, на якомубудується об'єктно-орієнтоване програмування. Інкапсуляціяполягає в тому, що об'єкт приховує в собі деталі, які несуттєвідля використання об'єкта. У традиційному підході до програмування звикористанням глобальних змінних програміст не був застрахований відпомилок, пов'язаних з використанням процедур, не призначених дляобробки даних, пов'язаних з цими змінними. Припустимо, наприклад, щоє «не-ООП» програма, призначена для нарахування заробітної платиспівробітникам певній організації, а в програмі є два масиви. Одинмасив зберігає величину заробітної плати, а інший - телефонні номериспівробітників (для формування звіту для податкової інспекції). Щостанеться, якщо програміст випадково переплутає ці масиви? Очевидно, длябухгалтерії почнуться важкі часи. «Жорстке» связаное даних і процедурїх обробки в одному об'єкті дозволить уникнути неприємностей такого роду.
Інкапсуляція і є засобом організації доступу до даних тільки черезвідповідні методи. p>
У нашому прикладі опис об'єкта процедура ініціалізації Init іфункції GetX і GetY вже не існують як окремі самостійніоб'єкти. Це невід'ємні частини об'єктного типу Location. Якщо в програміє опис декількох змінних зазначеного типу, то для кожноїзмінної резервується своя власна область пам'яті для зберіганняданих, а покажчики на точки входу в процедуру і функції - спільні. Викликкожного методу можливий тільки за допомогою складного імені, явновказує, для обробки яких даних призначений даний метод. p>
5. Спадкування p>
Спадкування - це ще одне базове поняття об'єктно-орієнтованогопрограмування. Успадкування дозволяє визначати нові об'єкти,використовуючи властивості попередніх, доповнюючи або змінюючи їх. Об'єкт-спадкоємецьотримує всі поля та методи «батька», до яких він може додати своївласні поля та методи чи замінити ( «перекрити») їх своїми методами.
Приклад опису об'єкту-спадкоємця дається нижче: p>
Tipe p>
Point = object (Location) p>
Visible: Boolean; p>
Procedure Int ( IntX, IntY: Integer); p>
Procedure Show; p>
Procedure Hide; p>
Function IsVisible: Boolean; p>
Procedure MoveTo (NewX , NewY: Integer); p>
End; p>
Спадкоємцем тут є об'єкт Point, що описує графічнукрапку, а батьком - об'єкт Location. Спадкоємець не містить опис поліві методів з батьків. Ім'я останнього вказується у круглих дужках післяслова object. З методів спадкоємця можна викликати методи з батьків. Длястворення спадкоємця не потрібно мати початковий текст об'єкта з батьків.
Об'єкт-батько може бути вже у складі оттранслірованного модуля. P>
У чому привабливість наслідування? Якщо якийсь об'єкт був вжевизначений і налагоджений, він може бути використаний і в інших програмах. Прице може виявитися, що нова задача відрізняється від попередньої, івиникає необхідність деякої модифікації як даних, так і методів їхобробки. Програмістові доводиться вирішувати дилему - створення об'єктівзаново або використовувати результати попередньої роботи, застосовуючи механізмуспадкування. Перший шлях менш ефективний, тому що вимагає додатковихвитрат часу на налагодження і тестування. У другому випадку частина цієївиконаної роботи виявляється, що скорочує час на розробку новоїпрограми. Програміст при цьому може і не знати деталей реалізації об'єкта -з батьків. p>
У нашому прикладі до об'єкту, пов'язаного з визначенням положенняграфічного елемента, просто додалося нове поле, що описує ознакавидимості графічної точки, і кілька нових методів, пов'язаних з режимомвідображення точки і її перетвореннями. p>
6. Віртуальні методи p>
Успадкування дозволяє створювати ієрархічні, пов'язані відносинамипідпорядкування, структури даних. Слід, однак, зазначити, що привикористанні цієї можливості можуть виникнути проблеми. Припустимо, щов нашій графічній програмі необхідно визначити об'єкт Circle, якийє нащадком іншого об'єкта Point: p>
Type p>
Circle = object (point) p>
Radius: Integer; p>
Procedure Show; p>
Procedure Hide; p>
Procedure Expand (ExpandBy: Integer); p>
Procedure Contact (ContactBy: Integer); p>
End; p >
Новий об'єкт Circle відповідає окружності. Оскільки властивостікола відрізняються від властивостей точки, в об'єкті-спадкоємця доведетьсязмінювати процедури Show і Hide, які відображають коло і видаляють їїзображення з екрана. Може виявитися, що метод Init (див. попереднійприклад) об'єкта Circle, успадкований від об'єкта Point, також використовуєметоди Show і Hide, надалі під час трансляції об'єкта Point використовуєпосилання на старі методи. Очевидно в об'єкті Circle вони працювати не будуть.
Можна, звичайно, спробувати «перекрити» метод Init. Щоб це зробити, намдоведеться повністю відтворити текст методу. Це ускладнить роботу, та й незавжди можливо, оскільки вихідного тексту програми може не виявитисяпід рукою (якщо об'єкт-батько вже знаходитися в оттранслірованном модулі). p>
Для вирішення цієї проблеми використовується віртуальний метод. Зв'язок міжвіртуальним методом і викликають їх процедурами встановлюється не учас трансляції (це називається раннім связаное), а під час виконанняпрограми (пізніше связаное. p>
Щоб використовувати віртуальний метод, необхідно в описі об'єктапісля заголовка методу додати ключове слово virtual. Заголовкивіртуальних методів батька та спадкоємця повинні в точності збігатися.
Ініціалізація примірника об'єкта, що має віртуальні методи, повиннавиконуватися за допомогою спеціального методу - конструктора. Конструкторзвичайно присвоює полях об'єкта початкові значення і виконує іншідії з ініціалізації об'єкту. У заголовку методу-конструктора словоprocedure замінюється словом constructor. Дії зворотні дійконструктора, виконує ще одна спеціальний метод - деструктор. Вінописується словом destructor. p>
Конструктор виконує дії з підготовки пізнього зв'язування. Цідії полягають у створенні покажчика на таблицю віртуальних методів,яка в подальшому використовується для пошуку методів. Таблиця міститьадреси всіх віртуальних методів. Коли Ви робите віртуального методу за йогоімені визначається адресу, а потім за цією адресою передається керування. p>
У кожного об'єктного типу є своя власна таблиця віртуальнихметодів, що дозволяє одному і тому ж оператору викликати різніпроцедури. За наявності кількох примірників об'єктів одного типу, тонедостатньо викликати конструктор для одного з них, а потім простоскопіювати цей екземпляр в усі інші. Кожен об'єкт повинен матисвій власний конструктор, який викликається для кожного екземпляра. Упротивному випадку можливий збій в роботі програми. p>
Зауважимо, що конструктор або деструктор, можуть бути «порожніми», тобтоне містити операторів. Весь необхідний код в цьому випадку створюється притрансляції ключових слів construct і destruct. p>
7. Динамічне створення об'єктів p>
Змінні об'єктного типу можуть бути динамічними, тобторозміщуватися в пам'яті тільки під час їх використання. Для роботи здинамічними об'єктами використовуються розширений синтаксис процедур New і
Dispose. Обидві процедури в цьому випадку містять в якості другого параметравиклик конструктора або деструктора для виділення або звільнення пам'ятізмінної об'єктного типу: p>
New (P, Construct)або p>
Dispose (P, Destruct) p>
Де P - покажчик на змінну об'єктного типу, а Construct або
Destruct - конструктор і деструктор цього типу. P>
Дія процедури New в разі розширеного синтаксису рівносильнодії наступної пари операторів: p>
New (P); p>
P ^. Construct;
Еквівалентом Dispose є наступне: p>
P ^ Dispose; p>
Dispose (P) p>
Застосування розширеного синтаксису не тільки покращує читаністьвихідного коду, але і генерує більш короткий і ефективний виконуванийкод. p>
8. Поліморфізм p>
Поліморфізм полягає в тому, що одне і те ж ім'я можевідповідати різним діям в залежності від типу об'єкта. У тихприкладах, які розглядалися раніше, поліморфізм проявлявся в тому, щометод Init діяв по-різному в залежності від того, чи є об'єктточкою або колом. Поліморфізм безпосередньо пов'язаний з механізмом пізньогозв'язування. Рішення про те, яка операція повинна бути виконана вконкретної ситуації, приймається під час виконання програми. p>
Наступне питання, пов'язаний з використанням об'єктів, полягає всумісності об'єктних типів. Корисно знати наступне. Спадкоємець зберігаєвластивості сумісності з іншими об'єктами свого батька. У правій частиніоператора присвоєння замість типів батька можна використовувати типиспадкоємця, але не навпаки. Таким чином, у нашому прикладі припустиміприсвоювання: p>
Var p>
Alocation: Location; p>
Apoin: Point; p>
Acircle: Circle; p>
Alocation: = Apoint p>
Apoint: = Acrcle; p>
Alocation: = Acircle; p>
Справа в тому, що спадкоємець може бути більш складним об'єктом,містить поля і методи, тому що привласнюються значення екземпляра об'єкта -батька екземпляру об'єкта-спадкоємця може залишити деякі поляневизначеними і, отже, представляє потенційну небезпеку. Привиконання оператора присвоєння копіюються тільки ті поля даних, якіє спільними для обох типів. p>
-----------------------< br>[1] Виконується на мові Turbo Pascal, починаючи з версії 5.0. Далі всеприклади дані для виконання на цю мову програмування. p>
p>