You are on page 1of 36

Об’єктно-орієнтоване

програмування
Максим Михайлович Древаль
m.dreval@kpi.ua

Кафедра математичних методів системного аналізу (ММСА)


Інститут прикладного системного аналізу
НТУУ «КПІ ім. І.Сікорського»

Весняний семестр 2020/21


Старт курсу — 06 лютого 2021

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 1
У попередній серії…

➢ Inline-функції

➢ Вказівник this

➢ Const-функції

➢ «Роздільна» компіляція

➢ Програмуємо першу лабку!

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 2
Огляд основних
парадигм програмування

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 3
Парадигма («нудне» визначення)

Парадигма (з грец. «приклад, модель, зразок») —


універсальний метод прийняття еволюційних
рішень, гносеологічна модель еволюційної
діяльності.

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 4
Парадигма (менш «нудне» визначення)

Парадигма (англ. Paradigm) — це спосіб


тлумачення людиною даного об'єкту або явища.

➢ Термін також часто використовується в значеннях:


➢ «теорія»;
➢ «модель»;
➢ «уявлення»;
➢ «поняття»;
➢ «система поглядів»…

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 5
Парадигма у прийнятті рішень

суб’єкт

проблема сприйняття аналіз синтез рішення

➢ Проблема спочатку проходить через суб’єктивну призму сприйняття

➢ Сприйняття, бачення проблеми — парадигма

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 6
Сприйняття

➢ Уважно подивіться на картинку 7-10 секунд

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 7
Сприйняття

➢ Уважно подивіться на картинку 7-10 секунд

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 8
Сприйняття

➢ Що ви бачите на цій картинці?

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 9
Сприйняття

➢ Сприйняття значно впливає на прийняття рішення

➢ Своєю чергою, сприйняття залежить від життєвого (практичного) досвіду

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 10
Парадигма у програмуванні

Парадигма програмування — спосіб побудови


системних абстракцій на основі властивостей
спільності і мінливості.

Парадигма програмування — це сукупність ідей і


понять, що визначає стиль написання програм.

➢ Існують й інші варіанти визначень, однак вони, загалом кажучи,


еквівалентні

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 11
Парадигма у програмуванні

Думки розумних людей

«Якщо прогрес мистецтва програмування в цілому


вимагає постійного створення і вдосконалення парадигм, то
вдосконалення мистецтва окремого програміста вимагає, щоб
він розширював свій репертуар парадигм»

Роберт Флойд

Видатний американський науковець в галузі інформатики.


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

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 12
Парадигма у програмуванні

➢ За концепцією фон-Неймана, засновника теоретичної концепції


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

програма

код дані

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 13
Основні парадигми програмування

* одна зі спрощених класифікацій

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 14
Імперативне програмування
Імперативне (процедурне) програмування — це парадигма
програмування, яка описує програму у вигляді послідовності дій,
або інструкцій, що змінюють дані.

➢ Код впливає на дані

➢ Оточуючий світ — «локально імперативний»

➢ Засноване на теоретичній моделі машини Тюрінга-Поста —


абстрактному обчислювальному пристрої, запропонованому на світанку
алгоритмічної ери для опису алгоритмів

➢ Найбільш придатне для реалізації невеликих підзадач, де важливою є


швидкість виконання на сучасних комп'ютерах з урахуванням взаємодії з
зовнішніми пристроями

➢ Приклади імперативно-орієнтованих мов: FORTRAN (1954), ALGOL


(кінець 1950-х), COBOL (1960), BASIC (1964), Pascal (1970-ті), C (1983),
Ada (1983)
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 15
Структурне програмування

Структурне програмування — це парадигма розробки


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

➢ Запропоноване в 70-х роках XX століття Е. Дейкстрой, розроблена і


доповнена Н. Віртом

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 16
Принципи структурного програмування

1. Програма являє собою структуру, побудовану з трьох типів базових


конструкцій:
• послідовне виконання;
• розгалуження;
• цикл.

2. Повторювані фрагменти програми (логічно цілісні обчислювальні блоки)


можуть бути оформлені у вигляді т. зв. підпрограм

3. Розробка програми ведеться покроково, методом «згори донизу»

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 17
Переваги структурного програмування

➢ Знижується складність коду програми

➢ Полегшується розуміння коду іншими розробниками

➢ Сама програма по суті є прямим відображенням власної блок-схеми

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


спрощується

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 18
Функціональне програмування

Функціональне (аплікативне) програмування — це


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

➢ Є представником декларативної парадигми програмування, яка


протиставляється парадигмі імперативного програмування

➢ Замість опису послідовності зміни станів, визначається функція,


застосування якої до вихідних даних дає необхідне розв’язання

➢ В окремих джерелах функціональне програмування називають


«функційним», вважаючи, що функціонально-орієнтоване програмування
— це інша категорія, в основі якої лежить компонування окремих програм
у ряд цілісних програмних продуктів

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 19
Функціональне програмування

𝑦Ԧ = 𝑓(𝑥)
Ԧ

𝑦Ԧ = 𝑓1 (𝑓2 𝑓3 … , 𝑓4 … , … )

➢ Розробка програми зводиться до конструювання складеної функції на


основі наявних стандартних простих функцій

➢ Функціональне програмування не передбачає опис зміни даних (відсутнє


таке поняття, як змінна)

➢ Основою для функціонального програмування є лямбда-числення Черча

➢ Приклади функціональних мов програмування: Xquery, Haskell, LISP (а


також сучасні нащадки Scheme і Common Lisp), ML (більш сучасні
діалекти — Standard ML і Objective CAML), Miranda, Erlang. Можливим є
також використання функціональної парадигми в C-подібних мовах

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 20
Функціональне програмування

➢ Функціональне програмування, як і інші «неімперативні» парадигми


програмування, зазвичай використовуються для вирішення задач,
розв’язання яких важко сформулювати в термінах послідовних операцій

➢ У цю категорію потрапляють практично всі завдання, пов'язані зі


штучним інтелектом:
➢ розпізнавання образів;
➢ розпізнавання природної мови та її відтворення;
➢ експертні системи;
➢ автоматичне доведення теорем;
➢ символьні обчислення.

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 21
Приклад
➢ Приклад розв’язання однієї й тієї ж задачі імперативним та
декларативним (функціональним) стилем мовою Python

Приклад Опрацювати кожен елемент списку x спочатку функцією


F, потім функцією G.

імперативний декларативний
compose2 = lambda A, B:
target = []
lambda x: A(B(x))
for item in source_list:
trans1 = G(item)
target =
trans2 = F(trans1)
map(compose2(F,G),
target.append(trans2)
source_list)

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 22
Функціональне програмування

Переваги функціонального підходу:

➢ Підвищення надійності коду

➢ Зручність організації модульного тестування

➢ Можливості оптимізації при компіляції

➢ Можливості паралелізму

Недоліки функціонального підходу:

➢ Відсутність присвоювань та заміна їх на породження нових даних


призводять до необхідності постійного виділення й автоматичного
звільнення пам’яті

➢ У «чистій» функціональній парадигмі відсутні цикли в звичному розумінні

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 23
Логічне програмування

Логічне програмування — це парадигма програмування,


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

➢ Програма являє собою деяку теорію і твердження, яке необхідно довести.


У доведенні цього твердження і полягатиме виконання програми

➢ Поняття логічного програмування: факти та аксіоми

➢ Використання алгоритмів уніфікації і методу резолюції

➢ Перша «логічна» мова — Planner, найвідоміший представник — Prolog

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 24
Логічне програмування
➢ Оператори програми виконуються не в тому порядку, у якому вони
записані, а на основі аналізу дозвільних умов:

ДУ1 → Д1
ДУ2 → Д2

ДУ𝑛 → Д𝑛

➢ Д𝑖 — дії, які виконуються за істинності відповідної дозвільної умови ДУ𝑖

➢ Виконання програми полягає у циклічній перевірці дозвільних умов та


виконання дій, відповідних дозвільним умовам у випадку їх істинності.
Завершення програми — у випадку істинності умови завершення

➢ Теоретичною концептуальною моделлю логічного програмування є


нормальні алгоритми Маркова

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 25
Логічне програмування

➢ Уніфікація — співставлення двох довільних термів, що містять змінні, з


метою визначення того, чи можна присвоїти цим змінним такі значення,
щоб вийшли два однакових терми.
➢ Наприклад, уніфікація термів f(X,2) і f(1,Y), де X, Y — змінні, видасть
підстановку: X = 1, Y = 2.

➢ Метод резолюцій полягає в послідовному доказі окремих тверджень, що


входять в посилку диз'юнкта Хорна, для доведення його наслідку.
➢ Застосування методу резолюцій до правила a :- b, c і твердження a
призведе до послідовного доведення тверджень b і c. При цьому порядок цілей
не має значення, тому їх можна доводити паралельно.

➢ Метод резолюцій має прямий аналог в алгебрі висловлень — правило


modus ponens: (A & A => B) => B.

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 26
Паралелізм

➢ Паралелізм можна уявно розбити на два рівні:


➢ паралелізм на рівні мікрооперацій;
➢ паралелізм на рівні процесів.

➢ Сучасні мікропроцесори максимально використовують у своїй архітектурі


можливості паралельного виконання окремих операцій

➢ Процеси — абстракція високого рівня. Процеси можуть виконуватися


паралельно та обмінюватися між собою результатами своїх обчислень
через специфічні «канали зв'язку»

➢ У концепції паралельних процесів кожен окремий процес обробляє події


Події можуть бути як загальними для всієї системи, так і індивідуальними
для одного або кількох процесів — подійно-кероване програмування

➢ Об’єктно-орієнтоване програмування — наступник подійно-керованого


програмування

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 27
Об’єктно-орієнтоване програмування

Об'єктно-орієнтоване програмування (ООП) — парадигма


програмування, у якій основними концепціями є поняття об'єктів
і класів (або прототипів).

Основні принципи ООП:

➢ Абстрагування

➢ Інкапсуляція (приховування та захист даних)

➢ Спадкування (наслідування)

➢ Поліморфізм (один інтерфейс — декілька реалізацій)

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 28
Об’єктно-орієнтоване програмування

Принципи ООП, сформульовані Аланом Кеєм, одним з «батьків-


засновників» ООП:

➢ Все є об'єкт.

➢ Обчислення здійснюються шляхом взаємодії (обміну даними) між


об'єктами, при якому один об'єкт вимагає, щоб інший об'єкт виконав
певну дію.

➢ Кожен об'єкт має незалежну пам'ять, яка складається з інших об'єктів.

➢ Кожен об'єкт є представником (екземпляром) класу, який описує загальні


властивості об'єктів.

➢ У класі задається поведінка (функціональність) об'єкта.

➢ Класи організовані в єдину деревоподібну структуру зі спільним коренем,


яка називається ієрархією спадкування.

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 29
Прототипне програмування

Прототипне програмування — це стиль об'єктно-


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

➢ Класичний приклад прототипно-орієнтованої мови — Self. Серед інших


прикладів наводять JavaScript, Cecil, NewtonScript, Io, Slate, MOO,
REBOL, Kevo, Lua

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 30
Програмування обмеженнями
Програмування обмеженнями (Constraint Programming) —
парадигма програмування, у якій відношення між змінними
сформульовані у формі обмежень.

➢ Обмеження відрізняються від загальних примітивів мов імперативного


програмування тим, що вони визначають не послідовність кроків для
виконання, а властивості шуканого рішення

➢ Тому програмування обмеженнями — форма декларативного


програмування

➢ Обмеження, які використовуються в програмуванні обмеженнями,


бувають різних видів, наприклад:
➢ які використовуються в задачах виконання умов (наприклад, «А або В
істинно»);
➢ які розв'язуються симплекс-методом (наприклад, «x ≤ 5»).

➢ Обмеження, як правило, вбудовані в мову програмування або


підключаються через окремі програмні бібліотеки
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 31
Інсерційне моделювання

Інсерційне моделювання — це моделювання на базі моделі


поведінки агентів в середовищах.

➢ В основі моделі — поняття розміченої transition-системи, тобто системи,


визначеної так само, як і автомат, множиною станів і множиною
переходів (пари станів), розмічених діями або подіями

➢ Поняття transition-системи формально збігається з поняттям


недетермінованого частково визначеного автомата, однак, на відміну від
теорії автоматів, відношення еквівалентності transition-систем більш
«сильне»

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 32
Мультипарадигмальне програмування

Мультипарадигмальне програмування — це програмування з


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

➢ Створення нової мови програмування

➢ Розширення існуючої мови програмування

➢ Вбудовані інтерпретатори

➢ Розширювані інтерпретатори

➢ Трансляція з однієї мови в іншу

➢ Збірка модулів, написаних на різних мовах програмування

➢ Бібліотечне розширення існуючої мови програмування

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 33
Мультипарадигмальне програмування

➢ Приклад мультипарадигмальної мови програмування — Lua

➢ Lua — інтерпретована мова програмування

➢ Є вільно поширюваною, з відкритими вихідними кодами на мові С

➢ Підтримує імперативну, функціональну, об'єктно-орієнтовану (прототипну)


парадигми

➢ Може легко вбудовуватися в програми, написані на C, C ++ тощо

➢ Підтримує завантаження зовнішніх модулів

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 34
Парадигми програмування

➢ Усі парадигми програмування — інструменти, покликані знизити


складність реалізації

➢ Кожна з парадигм має свої переваги та недоліки, різні методики дають


різні виграші для вирішення задач різних класів, які враховують такі
критерії:
➢ ефективність розробленого програмного забезпечення на сучасних
комп’ютерах;
➢ загальні витрати ресурсів на розробку програмного забезпечення.

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 35
Далі буде… ☺

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 36

You might also like