ООП - це що таке? Основні принципи об 'єктно-орієнтованого програмування

ООП - це що таке? Основні принципи об 'єктно-орієнтованого програмування

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

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


Процедурні мови

C, Pascal, FORTRAN і подібні мови є процедурними. Тобто кожен їхній оператор наказує комп 'ютеру щось зробити: отримати дані, скласти числа, розділити на шість, відобразити результат. Додаток процедурною мовою є списком інструкцій. Якщо він невеликий, ніякого іншого організаційного принципу (часто званого парадигмою) не потрібно. Програміст створює список інструкцій, і комп 'ютер виконує їх.

Розділення функції

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

Програма поділена на функції, кожна з яких має чітко визначену мету та інтерфейс.

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

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

Проблеми структурного програмування

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


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

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

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

Необмежений доступ

У програмі, написаній, наприклад, на C, є два види даних. Локальні приховані всередині функції та іншими процедурами не використовуються.

Коли дві і більше функцій повинні отримати доступ до одних і тих же даних, то останні повинні бути глобальними. Такими, наприклад, є відомості про враховані предмети. Глобальні дані можуть бути доступні будь-якій процедурі.

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

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


Наприклад, у програмі обліку хтось вирішить, що код ураховуваного предмета повинен складатися не з 5 цифр, а з 12. Це вимагає змінити тип даних з short на long. Тепер пов 'язані з кодом функції повинні бути змінені для роботи з новим форматом.

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

Моделювання реального світу

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

Атрибути

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

Поведінка

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


Вирішення проблеми

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

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

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

Сьогодні найбільш широко використовується мова ОВП (об 'єктно-орієнтоване програмування) - C++ (плюс-плюс). У Java відсутні деякі функції, такі як покажчики, шаблони і множина спадкування, що робить його менш потужним і універсальним, ніж C++. C # ще не досяг популярності C++.

Слід зазначити, що так звані функції-члени в C++ називаються методами в деяких інших ГО-мовах, таких як Smalltalk. Елементи даних називаються атрибутами. Виклик методу об 'єкта є посилкою йому повідомлення.


Аналогія

Можна представити об 'єкти відділами компанії. У більшості організацій співробітники не працюють один день з кадрами, на наступний нараховуючи зарплату, а потім тиждень займаючись роздрібною торгівлею. У кожного відділу є свій персонал з чітко покладеними на нього обов 'язками. Є і власні дані: показники заробітної плати, продажів, облік співробітників тощо. Люди у відділах працюють зі своєю інформацією. Поділ компанії, таким чином, полегшує контроль за її діяльністю і підтримує цілісність даних. Бухгалтерія відповідає за платіжні відомості. Якщо необхідно знати загальну суму заробітної плати, що виплачується в південній філії в липні, не потрібно ритися в архіві. Достатньо направити записку відповідальній особі, почекати, поки ця людина отримає доступ до даних і відправить відповідь з необхідною інформацією. Це гарантує відповідність регламенту і відсутність стороннього втручання. Таким же чином об 'єкт в ОВП забезпечує організацію додатку.

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

Об "єкт в ОВП: визначення

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

Які речі стають об 'єктами в ОВП? Нижче представлені типові категорії.

Фізичний об 'єкт в ОВП - це:


  • транспорт у моделях руху потоку;
  • електричні елементи в програмах схемотехніки;
  • країни в моделі економіки;
  • літак у системі управління повітряним рухом.

Елементи середовища комп 'ютера користувача:

  • меню;
  • вікна;
  • графіка (лінія, прямокутник, коло);
  • клавіатура, миша, принтер, дискові накопичувачі.

Люди:

  • працівники;
  • студенти;
  • клієнти;
  • продавці.

Дані:

  • книга обліку;
  • особиста справа;
  • словник;
  • таблиця широт і довгот населених пунктів.

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

Клас

Об 'єкти в ОВП - це члени класів. Що це означає? Мови програмування мають вбудовані типи даних. Тип int, тобто ціле число, визначено у C++. Можна оголошувати скільки завгодно змінних int.

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

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

Спадкування

У житті класи розділені на підкласи. Наприклад, тварини діляться на земноводних, ссавців, птахів, комах тощо.

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

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

Повторне використання

Після того як клас створений і налагоджений, він може бути переданий іншим програмістам для повторного використання у власних програмах. Це схоже на бібліотеку функцій, яка може входити в різні програми.

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

Створення нових типів даних

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

position1 = position + origin,

де position1, position і origin - пари незалежних численних величин. Створення класу, що включає ці два значення, і оголошення змінних об 'єктами створює новий тип даних.

Поліморфізм, перевантаження

Оператори = (дорівнює) і + (плюс), які використовуються в позиційній арифметиці вище, не діють так само, як з вбудованими типами, такими як int. Об 'єкти position та ін не визначені, а задані програмним шляхом. Як ці оператори знають, як поводитися з ними? Відповідь полягає в тому, що для них можна задати нові моделі поведінки. Ці операції будуть функціями-членами класу Position.

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

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