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

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

Використовуючи мову високого рівня, наприклад FORTRAN про­грамісти могли писати програми до кількох тисяч рядків довжиною. Для того часу такий підхід до програмування був найбільш перспективним. Однак мова програмування, що розумілася легко в коротких програмах, у великих програмах ставала нечитабельною (і некерованою). Порятунок від таких неструктурованих програм прийшов після винаходу в 1960 р. мов структурного програмування. До них належать мови Алгол, Паскаль і С. Структурне програмування має на увазі точно позначені керуючі структури, програмні блоки, відсутність (чи, принаймні, мінімальне ви­користання) операторів GОТО, автономні підпрограми, у яких підтри­мується рекурсія і локальні змінні. Суттю структурного програмування є можливість розбивки програми на її складові елементи. Використову­ючи структурне програмування, середній програміст може створювати і підтримувати програми понад 50000 рядків довжиною.

Хоча структурне програмування, при його використанні для напи­сання помірно складних програм, принесло гарні результати, воно вияв­лялося недієвим, коли програма досягала певної довжини. Щоб написати більш складну програму, необхідний був новий підхід до програмуван­ня. Як наслідок було розроблено принципи об'єктно-орієнтованого про­грамування (ООП). ООП акумулює найкращі ідеї, втілені в структур­ному програмуванні, і поєднує їх з могутніми концепціями, які дозволяють оптимально організовувати програми. Об'єктно-орієнтоване програмування дозволяє розкласти проблему на пов'язані між собою задачі. Кожна проблема стає самостійним об'єктом, що містить свої власні коди і дані, які належать до цього об'єкта. У цьому разі вся процедура в цілому спрощується і програміст одержує можливість оперувати з набагато більшими за обсягом програмами. Усі мови ООП, включаючи С++, ґрунтуються на трьох основних концепціях: інкапсуляції, поліморфізмі і спадкуванні. Розглянемо ці концепції.

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

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

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

У більш загальному сенсі, концепцією поліморфізму є ідея «один інтерфейс, безліч методів». Це означає, що можна створити загальний інтерфейс для групи близьких за змістом дій. При цьому виконання конкретної дії залежить від даних. Перевагою поліморфізму є те, що він допомагає знижувати складність програм, дозволяючи використання того ж інтерфейсу для задавання єдиного класу дій. Вибір же конкретної дії, залежно від ситуації, покладається на компілятор. Вам, програмісту, не потрібно робити цього вибору самому. Потрібно тільки пам'ятати і ви­користовувати загальний інтерфейс.

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

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