Знаймо

Додати знання

приховати рекламу

Цей текст може містити помилки.

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



План:


Введення

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


1. Історія

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

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

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

Першою мовою програмування, в якому були запропоновані принципи об'єктної орієнтованості, була Симула. У момент своєї появи (в 1967), ця мова програмування запропонував воістину революційні ідеї: об'єкти, класи, віртуальні методи та ін, однак це все не була сприйнята сучасниками як щось грандіозне. Тим не менше, більшість концепцій були розвинені Аланом Кейем і Деном Інгаллс в мові Smalltalk. Саме він став першим широко поширеним об'єктно-орієнтованою мовою програмування.

В даний час кількість прикладних мов програмування ( список мов), що реалізують об'єктно-орієнтовану парадигму, є найбільшим по відношенню до інших парадигм. В області системного програмування досі застосовується парадигма процедурного програмування, і загальноприйнятою мовою програмування є мова C. Хоча при взаємодії системного і прикладного рівнів операційних систем помітний вплив стали надавати мови об'єктно-орієнтованого програмування. Наприклад, однією з найбільш поширених бібліотек Мультиплатформність програмування є об'єктно-орієнтована бібліотека Qt, написана мовою C + +.


2. Основні поняття

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

3. Визначення ООП і його основні концепції

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

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

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

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


3.1. Складності визначення

ООП має вже більш ніж сорокарічну історію, але, незважаючи на це, досі не існує чіткого загальноприйнятого визначення даної технології [1]. Основні принципи, закладені в перші об'єктні мови і системи, піддалися суттєвого зміни (або спотворення) і доповненню при численних реалізаціях наступного часу. Крім того, приблизно з середини 1980-х років термін "об'єктно-орієнтований" став модним, в результаті з ним сталося те саме, що дещо раніше з терміном "структурний" (що став модним після поширення технології структурного програмування) - його стали штучно "прикріплювати" до будь-яких нових розробок, щоб забезпечити їм привабливість. Бьерн Страуструп в 1988 році писав, що обгрунтування "об'єктної орієнтованості" чого-небудь, у більшості випадків, зводиться до помилкового силлогизму : "X - це добре. Об'єктна орієнтованість - це добре. Отже, X є об'єктно-орієнтованим".

Тімоті Бадд пише [2] [3] :

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

На думку Алана Кея, творця мови Smalltalk, якого вважають одним із "батьків-засновників" ООП, об'єктно-орієнтований підхід полягає в наступному наборі основних принципів (цитується по вищезгаданій книзі Т. Бадда).

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

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

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

Визначити ООП можна і багатьма іншими способами [4].


3.2. Концепції

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

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

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

Однак спільність механізму обміну повідомленнями має й інший бік - "повноцінна" передача повідомлень вимагає додаткових накладних витрат, що не завжди прийнятно. Тому в більшості нині існуючих об'єктно-орієнтованих мов програмування використовується концепція "відправка повідомлення як виклик методу" - об'єкти мають доступні ззовні методи, викликами яких і забезпечується взаємодія об'єктів. Даний підхід реалізований у величезній кількості мов програмування, в тому числі C + +, Object Pascal, Java, Oberon-2. На даний момент саме він є найбільш поширеним в об'єктно-орієнтованих мовах.

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


4. Особливості реалізації

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

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

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

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

Інкапсуляція забезпечується наступними засобами

Контроль доступу
Оскільки методи класу можуть бути як суто внутрішніми, що забезпечують логіку функціонування об'єкта, так і зовнішніми, за допомогою яких взаємодіють об'єкти, необхідно забезпечити прихованість перших при доступності ззовні других. Для цього в язики вводяться спеціальні синтаксичні конструкції, явно задають область видимості кожного члена класу. Традиційно це модифікатори public, protected і private, що позначають, відповідно, відкриті члени класу, члени класу, доступні тільки з класів-нащадків і приховані, доступні тільки усередині класу. Конкретна номенклатура модифікаторів і їх точний зміст розрізняються в різних мовах.
Методи доступу
Поля класу, в загальному випадку, не повинні бути доступні ззовні, оскільки такий доступ дозволив би довільним чином змінювати внутрішній стан об'єктів. Тому поля зазвичай оголошуються прихованими (або мову в принципі не дозволяє звертатися до полів класу ззовні), а для доступу до знаходяться в полях даними використовуються спеціальні методи, звані методами доступу. Такі методи або повертають значення того чи іншого поля, або роблять запис в це поле нового значення. При записі метод доступу може проконтролювати допустимість записуваного значення і, при необхідності, провести інші маніпуляції з даними об'єкта, щоб вони залишилися коректними (внутрішньо погодженими). Методи доступу називають ще аксессор (від англ. access - Доступ), а окремо - Геттер ( англ. get - Читання) та сетера ( англ. set - Запис) [5].
Властивості об'єкта
Псевдополя, доступні для читання і / або запису. Властивості зовні виглядають як поля і використовуються аналогічно доступним полях (з деякими виключеннями), однак фактично при зверненні до них відбувається виклик методів доступу. Таким чином, властивості можна розглядати як "розумні" поля даних, що супроводжують доступ до внутрішніх даних об'єкта-якими додатковими діями (наприклад, коли зміна координати об'єкта супроводжується його перемальовуванням на новому місці). Властивості, по суті - не більше ніж синтаксичний цукор, оскільки жодних нових можливостей вони не додають, а лише приховують виклик методів доступу. Конкретна мовна реалізація властивостей може бути різною. Наприклад, в C # оголошення властивості безпосередньо містить код методів доступу, який викликається тільки при роботі з властивостями, тобто не вимагає окремих методів доступу, доступних для безпосереднього виклику. У Delphi оголошення властивості містить лише імена методів доступу, які повинні викликатися при зверненні до поля. Самі методи доступу являють собою звичайні методи з деякими додатковими вимогами до сигнатурі.

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


5. Підходи до проектування програм в цілому

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

Об'єктно-орієнтоване проектування полягає в описі структури та поведінки проектованої системи, тобто, фактично, у відповіді на два основних питання:

  • З яких частин складається система.
  • У чому полягає відповідальність кожної з частин.

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

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

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


6. Споріднені методології

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

6.1. Компонентне програмування

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


6.2. Прототипних програмування

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

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

6.3. Клас-орієнтоване програмування

7. Продуктивність об'єктних програм

Граді Буч вказує [6] на наступні причини, що призводять до зниження продуктивності програм через використання об'єктно-орієнтованих засобів:

Динамічне зв'язування методів.
Забезпечення поліморфного поводження об'єктів призводить до необхідності пов'язувати методи, які викликаються програмою (тобто визначати, який конкретно метод буде викликатися) не на етапі компіляції, а в процесі виконання програми, на що витрачається додатковий час. При цьому реально динамічне зв'язування потрібно не більш ніж для 20% викликів, але деякі ООП-мови використовують його постійно.
Значна глибина абстракції.
ООП-розробка часто призводить до створення "багатошарових" додатків, де виконання об'єктом необхідної дії зводиться до безлічі звернень до об'єктів більш низького рівня. У такому додатку відбувається дуже багато викликів методів і повернень з методів, що, природно, позначається на продуктивності.
Спадкування "розмиває" код.
Код, що відноситься до "крайовим" класам ієрархії спадкоємства (які зазвичай і використовуються програмою безпосередньо) - знаходиться не тільки в самих цих класах, але і в їх класах-предків. Відносяться до одного класу методи фактично описуються в різних класах. Це призводить до двох неприємних моментів:
  • Знижується швидкість трансляції, так як компонувальнику доводиться довантажувати опису всіх класів ієрархії.
  • Знижується продуктивність програми в системі з сторінкової пам'яттю - оскільки методи одного класу фізично знаходяться в різних місцях коду, далеко один від одного, при роботі фрагментів програми, активно звертаються до успадкованим методам, система змушена проводити часті перемикання сторінок.
Інкапсуляція знижує швидкість доступу до даних.
Заборона на прямий доступ до полів класу ззовні призводить до необхідності створення та використання методів доступу. І написання, і компіляція, і виконання методів доступу пов'язане з додатковими витратами.
Динамічне створення і знищення об'єктів.
Динамічно створювані об'єкти, як правило, розміщуються в купі, що менш ефективно, ніж розміщення їх на стеку і, тим більше, статичне виділення пам'яті під них на етапі компіляції.

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


8. Критика ООП

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

Критичні висловлювання на адресу ООП:

  • Дослідження Thomas E. Potok, Mladen Vouk і Andy Rindos [1] показало відсутність значимої різниці в продуктивності розробки програмного забезпечення між ООП та процедурних підходом.
  • Крістофер Дейта вказує на неможливість порівняння ООП і інших технологій багато в чому через відсутність суворого і загальновизнаного визначення ООП (CJ Date, Introduction to Database Systems, 6th-ed., Page 650)
  • Олександр Степанов, в одному зі своїх інтерв'ю, вказував на те, що ООП "методологічно неправильно" і що "... ООП практично така ж містифікація як і штучний інтелект ..." ([2]).
  • Фредерік Брукс (Frederick P. Brooks, Jr.) в своїй статті "No Silver Bullet. Essence and Accidents of Software Engineering" (Computer Magazine; April 1987) вказує на те, що найбільш складною частиною створення програмного забезпечення є "... специфікація, дизайн і тестування концептуальних конструкцій, а аж ніяк не робота за висловом цих концептуальних конструкцій ...". ООП (поряд з такими технологіями як штучний інтелект, верифікація програм, автоматичне програмування, графічне програмування, експертні системи та ін), на його думку, не є "срібною кулею", яка могла б на порядок величини (тобто приблизно в 10 разів, як мовиться в статті) знизити складність розробки програмних систем. Згідно Бруксу, "... ООП дозволяє скоротити тільки привнесену складність у вираз дизайну. Дизайн залишається складним за своєю природою ...". ([3])
  • Едсгер Дейкстра вказував: "... то про що суспільство в більшості випадків просить - це зміїне масло. Природно," зміїне масло "має дуже вражаючі імена, інакше буде дуже важко щось продати:" Структурний аналіз і Дизайн "," Програмна інженерія " , "Моделі зрілості", "Керуючі інформаційні системи" (Management Information Systems), "Інтегровані середовища підтримки проектів", "Об'єктна орієнтованість", " Реінжиніринг бізнес-процесів "..." - EWD 1175: The strengths of the academic enterprise
  • Ніклаус Вірт вважає, що ООП - не більше ніж тривіальна надбудова над структурним програмуванням, і перебільшення її значущості, що виражається, зокрема, у включенні до мови програмування все нових модних "об'єктно-орієнтованих" коштів, шкодить якості розроблюваного програмного забезпечення.
  • Патрік Кіллеліа в своїй книзі "Тюнінг веб-сервера" писав: "... ООП надає вам безліч способів уповільнити роботу ваших програм ..."
  • Відома оглядова стаття проблем сучасного ООП-програмування перераховує деякі типові проблеми ООП - Чому об'єктно-орієнтоване програмування провалилося

Якщо спробувати класифікувати критичні висловлювання на адресу ООП, можна виділити декілька аспектів критики даного підходу до програмування.

Критика реклами ООП.
Критикується явно висловлювана або імпліцитне в роботах деяких пропагандистів ООП, а також у рекламних матеріалах "об'єктно-орієнтованих" засобів розробки уявлення про об'єктному програмуванні як про якийсь всемогутньому підході, який магічним чином усуває складність програмування. Як зазначали багато, в тому числі згадані вище Брукс і Дейкстра, "срібної кулі не існує" - незалежно від того, який парадигми програмування дотримується розробник, створення нетривіальною складної програмної системи завжди пов'язане зі значними витратами інтелектуальних ресурсів і часу. З найбільш кваліфікованих фахівців в області ООП ніхто, як правило, не заперечує справедливість критики цього типу.
Оспорювання ефективності розробки методами ООП.
Критики оспорюють теза про те, що розробка об'єктно-орієнтованих програм вимагає менше ресурсів або призводить до створення більш якісного ПО. Проводиться порівняння витрат на розробку різними методами, на підставі якого робиться висновок про відсутність у ООП переваг у даному напрямку. Враховуючи крайню складність об'єктивного порівняння різних розробок, подібні зіставлення, як мінімум, спірні. З іншого боку виходить що рівно так само спірні і утвердження про ефективність ООП.
Продуктивність об'єктно-орієнтованих програм.
Вказується на те, що цілий ряд "вроджених особливостей" ООП-технології робить побудовані на її основі програми технічно менш ефективними, у порівнянні з аналогічними необ'ектнимі програмами. Не заперечуючи дійсно наявних додаткових накладних витрат на організацію роботи ООП-програм (див. розділ "Продуктивність" вище), потрібно, однак, відзначити, що значення зниження продуктивності часто перебільшується критиками. У сучасних умовах, коли технічні можливості комп'ютерів надзвичайно великі й постійно зростають, для більшості прикладних програм технічна ефективність виявляється менш істотна, ніж функціональність, швидкість розробки і сопровождаемость. Лише для деякого, дуже обмеженого класу програм (ПО вбудованих систем, драйвери пристроїв, низькорівнева частина системного ПЗ, наукове ПЗ) продуктивність залишається критичним фактором.
Критика окремих технологічних рішень в ООП-мовах і бібліотеках.
Ця критика численна, але зачіпає вона не ООП як таке, а прийнятність і застосовність в конкретних випадках тих чи інших реалізацій її механізмів. Одним з улюблених об'єктів критики є мова C + +, що входить в число найбільш поширених промислових ООП-мов.

9. Об'єктно-орієнтовані мови

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

Сучасний об'єктно-орієнтована мова пропонує, як правило, наступний обов'язковий набір синтаксичних засобів:

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

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

  • Конструктори, деструктори, фіналізатори.
  • Властивості (аксессор).
  • Індексатори.
  • Інтерфейси (наприклад, в Java використовуються також як альтернатива множинного спадкоємства - будь-який клас може реалізувати скільки завгодно інтерфейсів).
  • Перевизначення операторів для класів.
  • Засоби захисту внутрішньої структури класів від несанкціонованого використання ззовні. Зазвичай це модифікатори доступу до полів і методів, типу public, private, зазвичай також protected, іноді деякі інші.

Частина мов (іноді званих "чисто об'єктними") цілком побудована навколо об'єктних засобів - у них будь-які дані (можливо, за невеликим числом винятків у вигляді вбудованих скалярних типів даних) є об'єктами, будь-який код - методом якого класу, і неможливо написати програму , в якій не використовувалися б об'єкти. Приклади подібних мов - Smalltalk, Python, Java, C #, Ruby, AS3. Інші мови (іноді використовується термін "гібридні") включають ООП-підсистему в початково процедурний мова. У них існує можливість програмувати, не звертаючись до об'єктним засобам. Класичні приклади - C + +, Delphi і Perl.


Примітки

  1. Nobody Agrees On What OO Is - c2.com/cgi/wiki? NobodyAgreesOnWhatOoIs
  2. Тімоті Бадд. Об'єктно-орієнтоване програмування в дії = An Introduction to Object-Oriented Programming. - СПб. : "Пітер", 1997. - 464 с. - (У дії). - 6000 прим. - ISBN 5-88782-270-8
  3. Roger King, My cat is object-oriented - dl.acm.org / citation.cfm? id = 66469 & preflayout = flat
  4. Визначення ООП - c2.com/cgi/wiki? DefinitionsForOo
  5. Слід однак зауважити, що використання аксессор підриває інкапсуляцію, суть якої полягає не в приховуванні всіх і всієї членів об'єкта, а в тому, що внутрішньо стан об'єкта використовується лише для роботи, що здійснюється ним безпосередньо. У ООП програміст працює з поняттями, а не з даними.
  6. Греді Буч. Об'єктно-орієнтований аналіз та проектування з прикладами додатків на С + + = Object-Oriented Analysis and Design with Applications / Пер. І.Романовскій, Ф.Андреев. - 2-ге вид. - М., СПб.: "Біном", "Невський діалект", 1998. - С. 276-278. - 560 с. - 6000 прим. - ISBN 5-7989-0067-3

Література

  • Design Patterns
  • Іан Грехем. Об'єктно-орієнтовані методи. Принципи та практика = Object-Oriented Methods: Principles & Practice. - 3-е изд. - М .: "Вильямс", 2004. - С. 880. - ISBN 0-201-61913-X
  • Антоні Сентес. Освой самостійно об'єктно-орієнтоване програмування за 21 день = Sams Teach Yourself Object-Oriented Programming in 21 Days. - М .: "Вильямс", 2002. - С. 672. - ISBN 0-672-32109-2

Цей текст може містити помилки.

Схожі роботи | скачати

Схожі роботи:
Інтерфейс (об'єктно-орієнтоване програмування)
Суб'єктно-орієнтоване програмування
Об'єктно-орієнтоване проектування
Аспектно-орієнтоване програмування
Подієво-орієнтоване програмування
Компонентно-орієнтоване програмування
Об'єктно-орієнтована мова програмування
Об'єктно-орієнтована СУБД
Об'єктно-орієнтована база даних
© Усі права захищені
написати до нас
Рейтинг@Mail.ru