Об'єктно-орієнтоване програмування
Матеріал з Вікіпедії — вільної енциклопедії.
Об'єктно́-орієнтоване́ програмува́ння (ООП) — одна з парадигм програмування, яка розглядає програму як множину «об'єктів», що взаємодіють між собою. В ній використано декілька технологій від попередніх парадигм, зокрема успадкування, модульність, поліморфізм та інкапсуляцію. Не зважаючи на те, що ця парадигма з'явилась в 1960-тих роках, вона не мала широкого застосування до 1990-тих. На сьогодні багато із мов програмування (зокрема, Java, ActionScript 3, C#, C++, Python, PHP, Ruby та Objective-C) підтримують ООП.
Об'єктно-орієнтоване програмування сягає своїм корінням до створення мови програмування Симула в 1960-тих роках, одночасно з посиленням дискусій про кризу програмного забезпечення. Разом із тим, як ускладнювалось апаратне та програмне забезпечення, було дуже важко зберегти якість програм. Об'єктно-орієнтоване програмування частково розв'язує цю проблему шляхом наголошення на модульності програми[1].
На відміну від традиційних поглядів, коли програму розглядали як набір підпрограм, або як перелік інструкцій комп'ютеру, ООП програми можна вважати сукупністю об'єктів. Відповідно до парадигми об'єктно-орієнтованого програмування, кожний об'єкт здатний отримувати повідомлення, обробляти дані, та надсилати повідомлення іншим об'єктам. Кожен об'єкт — своєрідний незалежний автомат з окремим призначенням та відповідальністю[2].
Зміст |
[ред.] Фундаментальні поняття
В результаті дослідження Дебори Дж. Армстронг (англ. Deborah J. Armstrong)[3] комп'ютерної літератури, що була видана протягом останніх 40 років, вдалось відокремити фундаментальні поняття (принципи), використанні у переважній більшості визначень об'єктно-орієнтованого програмування. До них належить:
- Клас
- Клас визначає абстрактні характеристики деякої сутності, включаючи характеристики самої сутності (її атрибути або властивості) та дії, які вона здатна виконувати (її поведінки, методи або можливості). Наприклад, клас
Собакаможе характеризуватись рисами, притаманними всім собакам, зокрема: порода, колір хутра, здатність гавкати. Класи вносять модульність та структурованість в об'єктно-орієнтовану програму. Як правило, клас має бути зрозумілим для не-програмістів, що знаються на предметній області, що, у свою чергу, значить, що клас повинен мати значення в контексті. Також, код реалізації класу має бути досить самодостатнім. Властивості та методи класу, разом називаються його членами. - Об'єкт
- Окремий екземпляр класу. Клас
Собакавідповідає всім собакам шляхом опису їхніх спільних рис; об'єктСіркоє одним окремим собакою, окремим варіантом значень характеристик.Собакамає хутро;Сіркомає коричнево-біле хутро. Об'єктСіркоє екземпляром класуСобака. Сукупність значень атрибутів окремого об'єкту називається станом. - Метод
- Можливості об'єкту. Оскільки
Сірко—Собака, він може гавкати. Томугавкати()є одним із методів об'єктуСірко. Він може мати і інші методи, зокрема:місце(), абоїсти(). В межах програми, використання методу має впливати лише один об'єкт; всіСобакиможуть гавкати, але треба щоб гавкала лише одна окрема собака. - Обмін повідомленнями
- «Передача даних від одного процеса іншому, або надсилання викликів методів.»[3]
- Успадкування
- В деяких випадках, клас може мати «підкласи», спеціалізовані версії класу. Наприклад, клас
Собакаможе мати підкласиКоллітаПікінес. В цьому випадку,Сіркобуде екземпляром класуВівчарка. Підкласи успадковують атрибути та поведінку своїх батьківських класів, і можуть вводити свої власні. - Приховування інформації (інкапсуляція)
- Приховування деталей про роботу класів від об'єктів, що їх використовують або надсилають їм повідомлення. Так, наприклад, клас
Собакамає методгавкати(). Реалізація цього методу описує як саме повинно відбуватись гавкання (приміром, спочаткувдихнути()а потімвидихнути()на обраній частоті та гучності). Петро, хазяїн псаСірка, не повинен знати як він гавкає. Інкапсуляція досягається шляхом вказування, які класи можуть звертатися до членів об'єкту. Як наслідок, кожен об'єкт представляє кожному іншому класу певний інтерфейс — члени, доступні іншим класам. Інкапсуляція потрібна для того, аби запобігти використанню користувачами інтерфейсу тих частин реалізації, які, швидше за все, будуть змінюватись. Це дозволить полегшити внесення змін, тобто, без потреби змінювати і користувачів інтерфейсу. Наприклад, інтерфейс може гарантувати, що щенята можуть додаватись лише до об'єктів класуСобакакодом самого класу. Часто, члени класу позначаються як публічні (англ. public), захищені (англ. protected) та приватні (англ. private), визначаючи, чи доступні вони всім класам, підкласам, або лише до класу в якому їх визначено. Деякі мови програмування йдуть ще далі: Java використовує ключове слово private для обмеження доступу, що буде дозволений лише з методів того самого класу, protected — лише з методів того самого класу і його нащадків та з класів із того ж самого пакету, C# та VB.NET відкривають деякі члени лише для класів із тієї ж збірки шляхом використання ключового слова internal (C#) або Friend (VB.NET), а Eiffel дозволяє вказувати які класи мають доступ до будь-яких членів. - Абстрагування
- Спрощення складної дійсності шляхом моделювання класів, що відповідають проблемі, та використання найприйнятнішого рівня деталізації окремих аспектів проблеми. Наприклад
СобакаСіркобільшу частину часу може розглядатись якСобака, а коли потрібно отримати доступ до інформації специфічної для собак породи коллі — якКолліі якТварина(можливо, батьківський класСобака) при підрахунку тварин Петра. - Поліморфізм
- Поліморфізм означає залежність поведінки від класу, в якому ця поведінка викликається, тобто, два або більше класів можуть реагувати по різному на однакові повідомлення. Наприклад, якщо
Собакаотримує командуголос(), то у відповідь можна отриматиГав; якщоСвиняотримує командуголос (), то у відповідь можна отриматиХрю.
[ред.] Прототипно-орієнтоване програмування
Не всі із перелічених вище концепцій присутні у всіх об'єктно-орієнтованих мовах програмуваннях. Зокрема, в прототипно-орієнтованому програмуванні не використовуються класи. Як наслідок, зовсім інша, але аналогічна термінологія використовується для визначення об'єкту та екземпляру в цих мовах.
[ред.] Критика
- Результати дослідження Potok'а та інших [1] не показали істотної різниці у продуктивності між ООП та процедурним підходами.
- Christopher J. Date заявляє, що критичне порівняння ООП з іншими технологіями, зокрема, реляційною практикою є дуже складним через відсутність узгодженості та чіткого визначення ООП[4]
- Александр Степанов стверджує, що ООП забезпечує математично обмежену точку зору, і назвав його «майже таким великим обманом, як і Штучний інтелект» (мабуть, маючи на увазі невдалі і надміру «роздуті» проекти по створенню штучного інтелекту у 1980-х).
- Едсгер Дійкстра «… те, що суспільство вимагає переважаючи — це панацея. Звісно, панацея має різноманітні назви — інакше ви не продали б нічого подібного до „Structured Analysis and Design“, „Software Engineering“, „Maturity Models“, „Management Information Systems“, „Integrated Project Support Environments“ „Object Orientation“ та „Business Process Re-engineering“ (останні більш відомі, як IPSE, OO та BPR відповідно).» EWD 1175 The strengths of the academic enterprise.
[ред.] Джерела інформації
- Armstrong Deborah J. (February 2006). «The Quarks of Object-Oriented Development». Communications of the ACM 49 (2): 123–128. ISSN 0001-0782. Отриманий 2006-08-08.
- Meyer, Bertrand. Object-Oriented Software Construction (1997), Prentice Hall. ISBN 0-13-629155-4.
- ↑ Meyer, chapter 3
- ↑ Booch, chapter 2
- ↑ а б Armstrong, «The Quarks of Object-Oriented Development.» In descending order of popularity, the «quarks» are: Inheritance, Object, Class, Encapsulation, Method, Message Passing, Polymorphism, Abstraction
- ↑ C. J. Date, Introduction to Database Systems, 6th-ed., Page 650
[ред.] Дивіться також