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

Про матеріал
В даному матеріалі розкривається зміст поняття об“єктно-орієнтовного програмування та його основних понять та принципів шляхом встановлення взаємозвʼязку та аналогії між програмними та реальними обʼєктами.
Перегляд файлу

Первомайський ЦНТТУМ

Гурток «Сучасні технології програмування»

Керівник гуртка Семенова Олена Анатоліївна

Розробка заняття на тему:

Тема: «Об“єктно-орієнтовна технологія програмування. Основні поняття та принципи ОПП.»

Мета: розкрити зміст поняття об“єктно-орієнтовного програмування та його основних принципів, виховувати вміння встановлювати взаємозв              ʼязок та аналогію між програмними та реальними обʼєктами, розвивати увагу, спостережливість та логічне мислення.

Обладнання: ПК, ПЗ середовище програмування DevC++.

Хід заняття

1. Організаційний момент та розминка.

1. Складаємо всі разом 12 слів, що вміщують не менше 4 символів із літерами : «ф, і, в, а, п, р, о, л, д, ж, к, е, н, г, т, ь, и, м»

2. Записуємо 4 рядка цих слів за допомогою сліпого десятипальцевого методу набору.

3. Перевіряємо правильність набору та ставимо усні оцінки своїй роботі.

2. Повідомлення теми і мети заняття.

 В традиційному процедурному програмуванні, власне, це те, чим ми займались до цього моменту, програма — це набір інструкцій для компʼютера, що визначають дані через обʼєкти, а потім працюють з цими даними через оператори та функції. Обʼєкти та функції відповідно є окремими одиницями і це часто не дозволяє процедурному програмуванню використовувати інтуїтивне представлення реальності. Це є справою програміста: керувати та поєднувати властивості (змінні) з поведінкою (функціями) відповідним чином.

 А що ж саме є обʼєктно-орієнтовним програмуванням (скорочено ООП)?

 Для кращого розуміння скористаємось аналогією з навколишнім середовищем. Озирніться навколо — скрізь знаходяться обʼєкти: речі, будови, люди. Всі ці обʼєкти мають два основні компоненти:

1) Властивості. Як то: вага, розмір, форма, колір…

2) Поведінка, яку вони проявляють. Наприклад: (?) знаходитись десь, робити щось і т.д.

 Ці компоненти обʼєктів нероздільні.

 ООП надає можливість створювати такі обʼєкти, які поєднують властивості та поведінку в самостійні спілки, які потім є можливість багато разів використовувати. Такі спілки в ООП називають «класи» . Класи та обʼєкти класів  є основними поняттями ООП.

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

 Давайте розглянемо програмний обʼєкт на якомусь реальному прикладі. Скажімо, всім відомого предмета кухні — кавомолки. Вона має властивості, які були створені за шаблоном, що кимось колись описаний. Наприклад, як то швидкість, з якою крутяться лопаті або обʼєм чашки, так само, як її функція молоти каву. Кавомолок у світі існує багато, але всі вони одного типу, однієї властивості и виконують однакову функцію. За аналогією такий тип даних в ООП називається «клас», а функції обʼєкту класа називаються «методи», тобто це методи, за допомогою яких ви можете взаємодіяти з обʼєктом.

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

 Почнемо з першого… «ін» «капсуляція». Слово явно іноземного походження схоже на «в» «капсулі»… Тобто щось зачинено, недосяжне, скрито для бачення. Так воно і є. Це принцип незалежності даних в ООП. Тобто один програміст, розроблюючи клас обʼєкта, може скрити деякі властивості та функціонал від іншого користувача (іншого програміста) і залишити тільки зовнішній елемент управління.

 В нашій кавомолці це виглядає так: звичайному користувачу можна що зробити? Насипати зернятка, ввімкнути, перемолоти та вийняти результат. Але змінити швидкість, за якою крутяться лопаті, обʼєм чашки, в яку засипаються зернята, звичайний користувач не може — це його не стосується, це скрите… Варіант, коли цей самий звичайний користувач розбирає та ламає кавомолку, щоб залізти всередину та щось змінити, ми, за зрозумілими причинами, зараз розглядати не будемо. :)

 В програмному забезпеченні це виглядає так: ми користуємось, наприклад, стандартною бібліотекою namespace, але не бачимо сам код, та й не потрібен він нам, тому що все працює і без цього. :)

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

 Якщо взяти ту ж саму кавомолку як базовий клас, то який апарат, на вашу думку, може вважатись обʼєктом дочірнього класу? ..Правильно, кавомашина!

 Кавомолка має один вбудований функціонал: молоти каву.

 Кавомашина як обʼєкт має значно більше властивостей та методів, ніж кавомолка, але отримує від неї метод «молоти каву» та властивості як швидкість обертання лопатей, таким чином, складає обʼєкт дочірнього класу із власним доповненим функціоналом: варити та наливати каву. Але цьому обʼєкту вже не треба заново писати функціонал «засипати та перемолоти каву» та описувати швидкість обертання лопатей. Простіше кажучи, ми просто взяли кавомолку як частину та помістили у кавомашину.

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

 Нарешті, третій принцип ООП, поліморфізм. Здавалося б, найстрашніше слово. :) Однак, все набагато простіше, аніж здається на перший погляд. Походить цей термін від давньогрецького πολύμορφος —різноманітний.

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

 Візьмемо для прикладу все той же клас «кавомолки». Згадайте, які вони бувають за типом … Електричні та (?) механічні, тобто, «ручні».

 В першому випадку кавомолка працює за допомогою електричного струму, а в другому доводиться більш повільно, зате безкоштовно :) молоти каву, обертаючи ручку кавомолки вручну.

 Тобто властивості цих обʼєктів різні: електрична та механічна, але метод залишається той самий: молоти каву.

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

клас споруд

властивості — швидкість виробництва

метод   - виробництво продукту

 Які можуть бути обʼєкти даного класу?

 Приклад:

 Ферма по виробництву зерна, ферма по вирощуванню корів та, скажімо, фабрика виробництва тістечок :).

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

 Таким чином, ми бачимо, що обовʼязкові компоненти ООП — це клас та обʼєкт класу. Клас — це тип даних користувача, який користувач може написати власноруч.

 Основні найпростіші типи даних вам добре відомі. Згадуємо: () int, double, char, bool  і т.д. Ці прості типи даних добре відомі та описані в середовищі програмування.

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

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

 Створимо клас, що описує котів :)

class  Cats

{

};

 Як бачите, дуже схоже на те, як робиться описування функції. Відмінність в чому?

 Так, наприклад, після назви класа немає дужок, в яких ми вказуємо тип використовуваних змінних. Приклад для опису функції: int sum(int a, int b) { return a + b; }.

 class  Cats {};

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

 І тепер ми можемо в тілі програми створювати змінні із типом нашого класу.

іnt main ()

{

Cats cat1;

return 0;

}

 Як ви гадаєте, що ми отримаємо в цьому випадку? Правильно, нічого. Тому що наш клас — це тільки назва, ми не вказали навіть жодної властивості, а відомо, що будь-який тип даних має якісь властивості. Щоб їх вказати, можно скористуватись іншими простими типами даних або типами даних іншого класу, але для початку ми обмежимось не складними варіантами :)

 Давайте вкажемо властивості для нашого класу котів. Які у котів можуть бути властивості? Про тапки та обої краще не будемо згадувати :). Для початку ім“я та ..вік.

 

class  Cats

{

string name;

int age;

};

 До речі, звертаю вашу увагу на те, що string — це теж по суті клас, що включає текстові обʼєкти.

 І ще один важливий момент в описуванні класу — це модифікатори доступу типа public, private, protected. Як ви вже зрозуміли, мабуть, з їх назв, вони визначають доступність властивостей (які називають «полями») класу, для інших компонентів програми. Більш детально ми розглянемо модифікатори на наступних заняттях. А сьогодні просто використаємо, прийнявши як раніше за «так треба» без запитань приймали  #include <iostream> :) або Int main ().

 

class  Cats

{public:

string name;

int age;

};

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

іnt main ()

{

Cats cat1;

return 0;

}

 Тепер, як і для звичайних змінних, треба задати їй початкове значення. Інакше що буде? Правильно, програма надасть їм будь-яке «довільне» значення.

 Щоб вік нашого першого кота набув значення, для початку записуємо назву змінної, потім ставимо крапку і після неї пишемо назву нашої властивості (поля), тобто age, потім значення як для стандартної змінної. Скажімо, так: cat1.age = 2;

 Аналогічно для імені.

 іnt main ()

{

Cats cat1;

cat1.name =“Simone“;

cat1.age = 2;

cout<<“cat1 name is -  “<<cat1.name<<endl;

cout<<“cat1 age is - “<<cat1.age<<endl;

return 0;

}

 Після компіляції в консолі бачимо імʼя та вагу нашого обʼєкта номер один. :)

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

 Як бачите, наш створений тип даних користувача досить успішно працює.

 

3. Підсумок заняття.

 Сьогодні ми ознайомились і, сподіваюсь, всі зрозуміли основний зміст, поняття та принципи ООП. Якщо у вас залишились запитання, давайте розглянемо їх.

4. Завдання для самостійної роботи

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

docx
Додано
31 березня 2020
Переглядів
1197
Оцінка розробки
Відгуки відсутні
Безкоштовний сертифікат
про публікацію авторської розробки
Щоб отримати, додайте розробку

Додати розробку