Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

О.О.П / ооп / 3_техн / Лекції / ООП _1.Технологии программирования_ у

.pdf
Скачиваний:
18
Добавлен:
30.05.2020
Размер:
440.94 Кб
Скачать

Лекція 1: Теоретичні основи об'єктно-орієнтованного програмування

План:

1.Введення.

2.Перехід від процедурного програмування до об'єктного.

3.Модульне програмування.

1.Введення

Складність сучасного програмного забезпечення вимагає від розробників володіння найбільш перспективними технологіями його створення. Одній з таких

технологій на справжній момент є об'єктно-орієнтоване програмування (ООП).

Застосування ООП дозволяє розробляти програмне забезпечення підвищеної

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

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

програмних засобів. Об'єктні моделі різних версій універсальних мов програмування

мають свої особливості, але в їх основі лежать єдині концепції, що дозволяє

говорити про теоретичні основи ООП.

1. Від процедурного програмування до об'єктного

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

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

програмні системи.

Перші програми були організовані дуже просто. Вони складалися з власне

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

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

більш осяжної за рахунок зниження рівня деталізації і природно дозволило збільшити її складність.

Поява в мовах засобів, що дозволяють оперувати підпрограмами, істотно

понизило трудомісткість розробки програм. Підпрограми можна було зберігати і

1

використовувати в інших програмах. В результаті бувальщини накопичені величезні бібліотеки розрахункових і службових підпрограм, які у міру потреби викликалися з програми, що розроблялася. Типова підпрограм (в основному бібліотечних), що

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

Підпрограми

Мал. 1. Архітектура програми, що використовує глобальну область даних

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

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

Необхідність виключення таких помилок привела до ідеї використання в

підпрограмах локальних даних (мал. 2).

Ивновь сложность разрабатываемого программного обеспечения стала

ограничиваться возможностью программиста отслеживать процессы обработки данных уже на новом уровне. К этому добавились проблемы согласования интерфейса при

ведении разработки несколькими программистами. В результате встал вопрос

создания технологии разработки сложных программных продуктов, снижающей

вероятность появления ошибок.

Підпрограми з локальними даними

Мал. 2. Архітектура програми, що

використовує підпрограми з

локальними даними

Зусиллями багатьох авторів така технологія була створена і отримала назву

«Структурне програмування». Структурним програмуванням є сукупність технологічних прийомів, що рекомендуються, охоплюють виконання всіх етапів розробки програмного забезпечення.

Були сформульовані основні принципи виконання розробки:

принцип низхідної розробки, що рекомендує на всіх етапах спочатку

2

визначати найбільш загальні моменти, а потім поетапно виконувати деталізацію (що

дозволяє послідовно концентрувати увагу на невеликих фрагментах розробки);

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

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

вірогідність помилки);

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

змістовного контролю всіх етапів розробки (чим раніше виявлена помилка, тим простіше за неї виправити).

У основі структурного програмування лежить декомпозиція (розбиття на частини)

складних систем з метою подальшої реалізації у вигляді окремих невеликих (до 40 ... 50

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

покрокової деталізації. З появою інших принципів декомпозиції (об'єктного, логічного і

так далі) даний спосіб отримав назву процедурної декомпозиції.

Метод покрокової деталізації полягає в наступному:

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

(мал. 3):

 

 

 

 

 

 

- послідовності

підзадач (наприклад,

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

даних, виведення даних)

 

 

 

 

 

 

- альтернативи підзадач (наприклад, додавання записів до файлу або їх

пошук)

 

 

 

 

 

 

- повторення підзадачі (наприклад, циклічно повторювана обробка даних);

Следование

 

 

Альтернатива

Цикл-пока

подзадача1

 

 

 

 

 

Немає

 

 

 

 

 

подзадача2

 

 

 

 

 

 

подзадача1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Мал. 3. Основні структури процедурної декомпозиції

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

3

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

Приклад 1. Процедурна декомпозиція (програма «Записник»): Хай потрібно розробити програму, яка в зручній для користувача формі дозволить записувати і потім знаходити телефони різних людей і організацій. «Зручна» форма на сучасному рівні

програмування припускає спілкування програми з користувачем через «меню».

Аналіз завдання показує, що програму можна будувати як послідовність

підпрограм. Отже, на першому кроці декомпозиції з використанням покрокової деталізації отримуємо

Основна програма:

Почати роботу.

Вивести меню на екран.

Ввести команду.

Виконати цикл обробки команд, що вводяться.

Завершити роботу.

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

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

Виконати цикл обробки команд, що вводяться:

цикл-пока команда = «завершити роботу» Виконати команду.

Ввести команду

все-цикл.

Після цього деталізуємо операцію «Виконати команду». Виконуємо декомпозицію, використовуючи відразу декілька конструкцій галуження.

Виконати команду:

якщо команда= «відкрити книжку»

то Відкрити книжку

інакше якщо команда= «додати»

то Додати запис

інакше якщо команда= «знайти»

то Знайти запис

все-если

4

все-если

все-если.

На цьому кроці можна поки зупинитися, оскільки дії, що залишилися, достатньо прості. «Вклавши» результати покрокової деталізації, отримаємо структурне представлення алгоритму основної програми об'ємом не більше 20... 30 операторів.

Основна програма:

Почати роботу.

Вивести меню на екран.

Ввести команду.

цикл-пока команда = «завершити роботу»

якщо команда= «відкрити книжку»

то Відкрити книжку

інакше якщо команда = «додати»

то Додати запис

інакше якщо команда= «знайти»

то Знайти запис

все-если

все-если

все-если

Ввести команду

все-цикл

Завершити роботу.

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

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

якщо <умова> та <дія 1> інакше <дія 2> все-если, а цикл з перевіркою умови виходу на початку - цикл-пока <дії> все-цикл. Вкладеність конструкцій визначається

відступами від початку рядка.

Остаточно, на першому рівні виділені підзадачі: «Вивести меню», «Ввести команду», «Відкрити книжку», «Додати запис» і «Знайти запис».

На наступному рівні визначаються підзадачі завдань другого рівня наприклад:

Открить_кніжку:

5

Ввести ім'я файлу

якщо існує файл Імякніжки

то Відкрити файл

інакше Вивести повідомлення про помилку

все-если

На цьому етапі отримуємо підзадачі: «Ввести ім'я файлу» і «Відкрити файл».

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

На мал. 1.4 показано, з яких підпрограм складатиметься система, що розробляється, і взаємодія останніх по викликах.

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

що викликаються з основної програми або підпрограм більш високого рівня.

Сформульована таким чином методика декомпозиції закріпила процедурний

або алгоритмічний підхід, що склався у той час, до програмування, при якому

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

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

званих процедурних мов програмування. Як правило, вони включали основних

«структурних» операторів управління, підтримували вкладення підпрограм,

локалізацію і обмеження області «видимості» даних. Серед найбільш відомих мов цієї групи варто назвати PL/1, ALGOL-68, Pascal, С.

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

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

Вивести

Ввести ім'я

Відкрити

Ввести

Додати запис

Ввести

Знайти запис

вікно з

файлу

файл

запис

у файл

ім'я

у файлі

Мал. 4. Алгоритмічна декомпозиція системи «записник»

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

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

6

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

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

модульного програмування.

3. Модульне програмування

Модульне програмування (мал. 5) припускає виділення груп підпрограм, що

використовують одні і ті ж глобальні дані, в окремо компільовані модулі (бібліотеки підпрограм), наприклад, модуль графічних ресурсів, модуль підпрограм виводу на

принтер. Зв'язки між модулями здійснюються через спеціальний інтерфейс, тоді як доступ до реалізації модуля (тілам підпрограм і деяким «внутрішнім» змінним)

заборонений.

Цю технологію підтримують сучасні версії мов Pascal і З (C++), мови Пекла і

Modula.

Використання модульного програмування істотно спрощує ведення розробки

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

організація модулів прихована від останніх і тому може змінюватися незалежно.

Взаємодія модулів здійснюється через спеціально обумовлені інтерфейси модулів. Крім

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

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

перевищує 100 000 операторів. Вузьким местомом модульного програмування є те, що

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

При збільшенні розміру програми понад 100000 операторів зазвичай зростає складність міжмодульних інтерфейсів, і передбачити взаємовплив окремих частин програми стає

практично неможливо.

Подпрограммы с локальными данными

Подпрограммы с локальными данными

Модули с локальными данными

Мал. 5. Архітектура програми, що складається з модулів

7

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

Контрольні питання:

1. Недоліки технології програмування, які привели до створення процедурного

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

2.Основні принципи структурного програмування.

3.Метод покрокової деталізації.

4.Модульне програмування.

Література:

1.Архангельский А.Я. Программирование в Delphi 7, М.,: ООО «Бином-Пресс»,

2003 г. – 1152 с.

2.Дарахвелидзе П. Г., Марков Е. П. Программирование в Delphi 7. — СПб.: БХВ-

Петербург, 2003. — 784 с: ил.

3.Колосов С.В. Программирование в среде Delphi., - Мн.: БГУИР, 2005, - 164 с.

4.Иванова Г.С., Ничушкина Т.Н., Пугачев Е.К. Об'ектно-ориентированное программирование: Учеб. Для вузов / Под ред. Г.С.Ивановой. – М.: Изд-во МГТУ им. Н.Э.Баумана, 2001 – 320с.

5.Пестриков В.М., Маслобоев А.Н., Delphi на примерах. – СПб.: БХВ – Петербург, 2005. 496 с.

8