Лекція 3:
Тема: Введення в об’єктноо-орієнтовану технологію програмування.
План:
1. Перехід від процедурного програмування до об'єктного.
2. Модульне програмування.
3. Базові поняття об'єктно-орієнтованого програмування.
Складність сучасного програмного забезпечення вимагає від розробників володіння найбільш перспективними технологіями його створення. Одній з таких технологій є об'єктно-орієнтоване програмування (ООП). Застосування ООП дозволяє розробляти програмне забезпечення підвищеної складності за рахунок поліпшення його технологічності (кращих механізмів розділення даних, збільшення повторюваності код, використання стандартизованных інтерфейсів користувача і так далі)
ООП з'явилося в результаті тривалої еволюції технології розробки програмних продуктів В основу еволюції лягло прагнення прискорити процес створення надійних програмних засобів. Об'єктні моделі різних версій універсальних мов програмування мають свої особливості, але в їх основі лежать єдині концепції, що дозволяє говорити про теоретичні основи ООП.
Поява в мовах засобів, що дозволяють оперувати підпрограмами, істотно понизило трудомісткість розробки програм. Підпрограми можна було зберігати і використовувати в інших програмах. В результаті бувальщини накопичені величезні бібліотеки розрахункових і службових підпрограм, які у міру потреби викликалися з програми, що розроблялася. Типова підпрограм (в основному бібліотечних), що виконують обробку всіх даних або їх частини (мал. 1) .программа того часу складалася з основної програми, області глобальних даних і набору.
Підпрограми
Мал. 1. Архітектура програми, що використовує глобальну область даних
Слабким местомом такої архітектури було те, що при збільшенні кількості підпрограм зростала вірогідність спотворення частини глобальних даних якою-небудь підпрограмою. Наприклад, бінарний пошук (ділення на половину, требі контролювати який масив повертається до головної програми).
Необхідність виключення таких помилок привела до ідеї використання в підпрограмах локальних даних (мал. 2).
Зусиллями багатьох авторів була створена нова технологыя, якаі отримала назву «Структурне програмування».
Ще раз згадаємо основні принципи виконання розробки:
принцип низхідної розробки, що рекомендує на всіх етапах спочатку визначати найбільш загальні моменти, а потім поетапно виконувати деталізацію (що дозволяє послідовно концентрувати увагу на невеликих фрагментах розробки);
Підпрограми
з локальними даними
Мал.
2. Архітектура програми, що використовує
підпрограми з локальними даними
ласне
структурне програмування, що рекомендує
певні структури алгоритмів і стиль
програмування (чим наочніше текст
програми, тим менше вірогідність
помилки);
принцип крізного структурного контролю, що припускає проведення змістовного контролю всіх етапів розробки (чим раніше виявлена помилка, тим простіше за неї виправити).
В основі структурного програмування лежить декомпозиція (розбиття на частини) складних систем з метою подальшої реалізації у вигляді окремих невеликих (до 40 ... 50 операторів) підпрограм. На відміну від використовуваного раніше інтуїтивного підходу до декомпозиції, структурний підхід вимагав представлення завдання у вигляді ієрархії підзадач простої структури, для отримання якої рекомендувалося застосовувати метод покрокової деталізації. З появою інших принципів декомпозиції (об'єктного, логічного і так далі) даний спосіб отримав назву процедурної декомпозиції.
Метод покрокової деталізації полягає в наступному:
визначається загальна структура програми у вигляді одного з трьох варіантів (мал. 3):
послідовності підзадач (наприклад, введення даних, перетворення даних, виведення даних)
альтернативи підзадач (наприклад, додавання записів до файлу або їх пошук)
Альтернатива
С
лідування
Цикл-доки
підзадача1
підзадача2
Немає
подзадача1
Мал. 3. Основні структури процедурної декомпозиції
кожна підзадача, у свою чергу, розбивається на підзадачі з використанням тих же структур;
процес продовжується, поки на черговому рівні не виходить підзадача, яка досить просто реалізується засобами використовуваної мови (1-2 керівників оператора мови).
Приклад 1. Процедурна декомпозиція (програма «Записник»): Хай потрібно розробити програму, яка в зручній для користувача формі дозволить записувати і потім знаходити телефони різних людей і організацій. «Зручна» форма на сучасному рівні програмування припускає спілкування програми з користувачем через «меню».
Аналіз завдання показує, що програму можна будувати як послідовність підпрограм. Отже, на першому кроці декомпозиції з використанням покрокової деталізації отримуємо
Основна програма:
Почати роботу.
Вивести меню на екран.
Ввести команду.
Виконати цикл обробки команд, що вводяться.
Завершити роботу.
Перші три підзадачі, виявлені на даному кроці, представляються нескладними, тому на наступному кроці деталізуємо дію «Виконати цикл обробки команд, що вводяться»
Виконати цикл обробки команд, що вводяться:
ц
икл-пока
команда
= «завершити роботу»
Виконати команду.
Ввести команду
все-цикл.
Після цього деталізуємо операцію «Виконати команду». Виконуємо декомпозицію, використовуючи відразу декілька конструкцій галуження.
Виконати команду:
якщо команда= «відкрити книжку»
то Відкрити книжку
інакше якщо команда= «додати»
то Додати запис
інакше якщо команда= «знайти»
то Знайти запис
все-если
все-если
все-если.
На цьому кроці можна поки зупинитися, оскільки дії, що залишилися, достатньо прості. «Вклавши» результати покрокової деталізації, отримаємо структурне представлення алгоритму основної програми об'ємом не більше 20... 30 операторів.
Основна програма:
Почати роботу.
Вивести меню на екран.
Ввести команду.
ц
икл-пока
команда
= «завершити роботу»
якщо команда= «відкрити книжку»
то Відкрити книжку
інакше якщо команда = «додати»
то Додати запис
інакше якщо команда= «знайти»
то Знайти запис
все-если
все-если
все-если
Ввести команду
все-цикл
Завершити роботу.
Примітка. Для запису алгоритму використаний псевдокод, в якому проходження відображається записом дій на різних рядках, галуження позначається конструкцією якщо <умова> та <дія 1> інакше <дія 2> все-если, а цикл з перевіркою умови виходу на початку - цикл-пока <дії> все-цикл. Вкладеність конструкцій визначається відступами від початку рядка.
Остаточно, на першому рівні виділені підзадачі: «Вивести меню», «Ввести команду», «Відкрити книжку», «Додати запис» і «Знайти запис».
На наступному рівні визначаються підзадачі завдань другого рівня
наприклад:
Открить_кніжку:
Ввести ім'я файлу
якщо існує файл Імякніжки
то Відкрити файл
інакше Вивести повідомлення про помилку
все-если
На цьому етапі отримуємо підзадачі: «Ввести ім'я файлу» і «Відкрити файл». Поступивши аналогічно з найбільш складними підзадачами першого рівня, отримуємо схему дворівневої алгоритмічної декомпозиції завдання.
На мал. 1.4 показано, з яких підпрограм складатиметься система, що розробляється, і взаємодія останніх по викликах.
Створена за наслідками декомпозиції програма має правильну з погляду структурної технології організацію, тобто включає 12 відносно невеликих підпрограм, що викликаються з основної програми або підпрограм більш високого рівня.
Сформульована таким чином методика декомпозиції закріпила процедурний або алгоритмічний підхід, що склався у той час, до програмування, при якому основна увага концентрується на визначенні послідовності дій.
Підтримка принципів структурного програмування була закладена в основу так званих процедурних мов програмування. Як правило, вони включали основних «структурних» операторів управління, підтримували вкладення підпрограм, локалізацію і обмеження області «видимості» даних. Серед найбільш відомих мов цієї групи варто назвати PL/1, ALGOL-68, Pascal, С.
Примітка. Одночасно із структурним програмуванням з'явилася величезна кількість мов, що базуються на інших концепціях, але більшість з них не витримала конкуренції. Якісь мови були просто забуті, ідеї інших були надалі використані в наступних версіях мов, що розвивалися.

|
Вивести вікно з текстом |
Ввести ім'я файлу |
Відкрити файл |
Ввести запис |
Додати запис у файл |
Ввести ім'я |
Знайти запис у файлі |
Мал. 4. Алгоритмічна декомпозиція системи «записник»
Подальше зростання складності і розмірів програмного забезпечення, що розробляється, зажадало розвитку структуризації даних і, відповідно, в мовах з'являється можливість визначення призначених для користувача типів даних. Одночасно посилюється прагнення розмежувати доступ до глобальних даних програми для зменшення кількості помилок. Результатом була поява і розвиток технології модульного програмування.
Модульне програмування (мал. 5) припускає виділення груп підпрограм, що використовують одні і ті ж глобальні дані, в окремо компільовані модулі (бібліотеки підпрограм), наприклад, модуль графічних ресурсів, модуль підпрограм виводу на принтер. Зв'язки між модулями здійснюються через спеціальний інтерфейс, тоді як доступ до реалізації модуля (тілам підпрограм і деяким «внутрішнім» змінним) заборонений.
Цю технологію підтримують сучасні версії мов Pascal і З (C++), мови Пекла і Modula.
Використання модульного програмування істотно спрощує ведення розробки програм декількома програмістами, кожен з яких розробляє свої модулі. Внутрішня організація модулів прихована від останніх і тому може змінюватися незалежно. Взаємодія модулів здійснюється через спеціально обумовлені інтерфейси модулів. Крім того, модулі надалі можуть використовуватися в інших розробках, що збільшує продуктивність праці програмістів.
Підпрограми
з
локальними даними
Підпрограмми
с
локальными даними
П
Модулі
с локальними даними
М


ал.
5. Архітектура програми, що складається
з модулів
Прагнення зменшити кількість зв'язків між окремими частинами програми привело до появи об'єктно-орієнтованого програмування (ООП).
У теорії програмування ООП визначається як технологія створення складного програмного забезпечення, яка заснована на представленні програми у вигляді сукупності об'єктів, кожен з яких є екземпляром певного типу (класу), а класи утворюють ієрархію із спадкоємством властивостей.
Взаємодія програмних об'єктів в такій системі здійснюється шляхом передачі повідомлень (мал. 1).
Примітка. Таке представлення програми вперше було використане в мові імітаційного моделювання складних систем Simula, що з'явився ще в 60-х роках. Природний для мов моделювання спосіб представлення програми отримав розвиток в іншій спеціалізованій мові моделювання - мові Smalltalk (70-і роки), а потім був використаний в нових версіях універсальних мов програмування, таких як Pascal, C++, Ада, Modula.
Основна позитивна якість ООП - скорочення кількості міжмодульних викликів і зменшення об'ємів інформації, передаваної між модулями, в порівнянні з модульним програмуванням. Це досягається за рахунок повнішої локалізації даних і інтеграції їх з підпрограмами обробки, що дозволяє вести практично незалежну розробку окремих частин (об'єктів) програми.