Основні концепції та принципи ООП

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

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

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

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

ООП характеризується наступними принципами (по Алану Кею) :

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

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

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

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

Поліморфізм (polymorphism) - властивість, що дозволяє використовувати один і той же інтерфейс для різних дій; поліморфній змінній, наприклад, може відповідати декілька різних методів.

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

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

Як це вже відзначалося на самому початку курсу, Java - лише одна з об'єктно-орієнтованих мов. Іншим активно використовуваним професійними програмістами мовою ТОП, з який ми познайомимося у наступному семестрі, являється C++. Надалі нас чекає знайомство з такими представниками цього сімейства, як Smalltalk, Delphi Pascal і CLOS. Слід мати на увазі, що в різних об'єктно-орієнтованих мовах для позначення одних і тих же концепцій ТОП використовуються ті, що злегка відрізняються один від одного терміни (див. словничок ТОП у кінці лекції).

Контроль під час компіляції та під час виконання

Мови програмування можна оцінити по тому, наскільки вони строгі до типам. Контроль типів включає перевірку існування планування для, типів їх параметрів, перевірку кордонів масивів і подібне. C + +, Java, Python, і Object Pascal віддають перевагу більш-менш ретельний контроль типів під час компіляції. С + +, можливо, найменш точний в цьому відношенні (на що вказує, наприклад, можливість присвоєння double до float), тоді як Java використовує перевірку типів найбільш широко. Це тому, що C++ забезпечує сумісність з Сі, який не дуже строго перевіряє типи під час компіляції. Наприклад, C і C++ вважають, що всі арифметичні типи сумісні (хоча привласнення float цілої змінної викличе попередження компілятора). У Object Pascal і Java логічне значення не є цілим, а символ - ще один відмінний і несумісний тип. Той факт, що віртуальна машина Java інтерпретує байтовий код під час виконання, не означає, що ця мова відмовляється від перевірки типів під час компіляції. Навпаки, у цій мові перевірка найбільш ретельно. Інші OО мови, такі як Smalltalk і CLOS, навпаки, схильні більшість перевірок типів (якщо не всі) здійснювати під час виконання.

Чисто об'єктно-орієнтовані та гібридні мови

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

Серед трьох наших мов, тільки Java і C # є чистими OО мовами (як Eiffel і Smalltalk). На перший погляд це здається позитивною ідеєю. Проте вона веде до того, що ви використовуєте купу статичних методів і статичних даних, що не так вже відрізняється від використання глобальних функцій і даних, за винятком більш складного синтаксису. На мою думку, чисті OО мови дають перевагу новачкам в ООП, тому що програміст змушений використовувати (і вчити) модель ООП. C++ і Object Pascal, навпаки, - типові приклади гібридних мов, які дозволяють програмістам використовувати при необхідності традиційний підхід C або Pascal.

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

Проста об'єктна модель і посилальної-об'єктна модель

Третій елемент, по якому розрізняються мови ООП - їх об'єктна модель. Деякі традиційні мови ООП дозволяють програмістам створювати об'єкти в стеку, в купі (у хіпі - heap) або в статичній пам'яті. У цих мовах змінна типу клас відповідає об'єкту в пам'яті. Так працює C++.

Останнім часом з'явилася тенденція використовувати іншу модель, часто звану посилально-об'єктною моделлю. У цій моделі кожен об'єкт динамічно розміщується в купі, а змінна типу клас фактично є посиланням або Хендл об'єкта в пам'яті (технічно це щось на кшталт покажчика). Java і Object Pascal обидва використовують цю посилальну модель. Як ми побачимо, коротко це означає, що вам необхідно не забути виділити пам'ять для об'єкта.