структурний программірованя - це перша закінчена методологія програмування. Структурне програмування справила величезний вплив на розвиток програмування. Цей метод застосовувався дуже широко в практичному програмуванні й донині не втратила свого значення для певного класу задач.

Структурний підхід базується на двох основних принципах:

1 - це використання процедурних мов програмування (Алгол, Паскаль, Сі);

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

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

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

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

Звірити адресу з базою наявних адрес

Якщо результат перевірки позитивний,надрукувати Так,

в іншому випадку надрукувати Ні.

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

program check_address (input, output); varan_address: Address; begin read_address (an _address);

if (check_database (an_address)) then

writelnTMIa "); else

Ця програма використовує процедуру read_ address для читання адреси та процедуру check_ database для звірки прочитаного адреси з інформацією в базі даних. Тепер ми можемо продовжити процес складання програми для процедур наступного рівня: читання адреси та звірки з базою даних.

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

Програма компонується з заглушками і може працювати. Заглушки дозволяють перевірити логіку верхнього рівня до реалізації наступного рівня.

Структурне програмування ясно визначило значення модульного побудови програмпри розробці великих проектів, але мови програмування ще слабо підтримували модульність. Єдиним способом структуризації програм було складання її з підпрограм або функцій. Контроль за правильністю виконання функцій, в тому числі відповідності кількості і типів фактичних аргументів очікуваним формальним параметрам, здійснювався тільки на стадії виконання (поняття прототипу функції з'явилося пізніше).

1.4. Підстави і історія об'єктно-орієнтованого підходу до програмування

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

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

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

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

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

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

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

Виникненню об'єктно-орієнтованого підходу до проектування систем сприяли такі досягнення технології:

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

2 - Досягнення в методології програмування, зокрема модульне побудова систем і інкапсуляція інформації.

3 - Теорія побудови і моделювання систем управління базами даних внесла в об'єктне програмування ідеї побудови відносин між об'єктами.

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

5 - Розвиток філософії і теорії пізнання. Багато в чому об'єктно-орієнтоване побудову систем - це певний погляд на модельований реальний світ. Саме в цьому аспекті філософія і теорія пізнання зробили сильний вплив на об'єктну модель. Ще древні греки розглядали світ у вигляді об'єктів або процесів. Декарт висунув припущення, що для людини природним представляється об'єктно-орієнтоване розгляд навколишнього світу. Мінський припустив, що розум проявляється як взаємодія агентів, які не вміють окремо мислити.

Об'єктно-орієнтований підхід до програмування підтримується мовами програмування, такими, як Смолток, Сі ++, Java і т.д. Мови є головними інструментами об'єктно-орієнтованого програмування, саме при їх розробці з'явилася більшість тих ідей, які і складають основу об'єктно-орієнтованого методу.

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

Потім з'явилися (і продовжують з'являтися) інші об'єктно-орієнтовані мови, які визначають сучасний стан програмування. Найбільш поширеними з них стали Сі ++, CLOS, Ейффель, Java.

програмне забезпечення

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

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

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

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

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

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

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

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

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

Найбільш загальна тактика програмування полягає в розкладанні процесу на окремі дії:

  • - функціонального опису на подфункции;
  • - відповідні програми на окремі інструкції.

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

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

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

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

Якщо програма розбивається на підпрограми, то для представлення результатів і аргументів часто доводиться вводити нові змінні і таким чином встановлювати зв'язок між підпрограмами. Такі змінні слід вводити і описувати на тому етапі розробки, на якому вони потрібні були. Більш того, деталізація опису процесу може супроводжуватися деталізацією опису структури використовуваних змінних. Отже, в мові повинні бути кошти для відображення ієрархічної структури даних. Що показує, яку важливу роль відіграє при покрокової розробки програми поняття процедури, локальності процедур і даних, структурування даних.

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

Фундаментальним поняттям і функціональним елементом технології структурного програмування є - модуль.

Модуль - це підпрограма, але оформлена відповідно до наступних правил:

  • 1. модуль повинен мати один вхід і один вихід і виконувати строго однозначну функцію, яка описується простим поширеним пропозицією природного (російської) мови або навіть пропозицією без присудка;
  • 2. модуль повинен забезпечувати компіляцію, незалежну від інших модулів, з «забування» всіх внутрішніх значень модулів;
  • 3. модуль може викликати інші модулі за їхніми іменами;
  • 4. хороший модуль не використовує глобальні змінні для спілкування з іншим модулем, так як потім важко відшукати модуль, який псує дані. При використанні глобальних змінних, потрібно чітко коментувати ті модулі, які тільки читають, і ті модулі, які можуть змінювати дані;
  • 5. модуль кодується тільки стандартними структурами і ретельно коментується.

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

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

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

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

  • - модульність програм;
  • - структурний кодування модулів програм;
  • - спадний проектування раціональної ієрархії модулів програм;
  • - спадна реалізація програми з використанням заглушок;
  • - здійснення планування на всіх стадіях проекту;
  • - наскрізний структурний контроль програмних комплексів в цілому і складових їх модулів.

Модульність програм характеризується тим, що вся програма складається з модулів. Деякі смислові групи модулів зосереджуються в окремих файлах. Наприклад, в окремих файлах (Unit) можуть бути зосереджені модулі текстового редактора і модулі ієрархічного меню.

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

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

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

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

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

При структурному програмуванні програма в основному реалізується (збирається і тестується) зверху вниз. Спочатку з 20-30 модулів пишеться ядро. Щоб почати тестувати, відсутні модулі нижніх рівнів замінюються заглушками. Після закінчення тестування ядра, заглушки замінюються новими готовими модулями, але якщо програма ще не закінчена, то для успішної її лінковки знадобляться всі нові заглушки відсутніх модулів. Потім проводиться тестування зібраної частини і т. Д.

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

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

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

Кожен новий варіант порівнюється з попереднім варіантом по описаним тут критеріям. Генерація варіантів припиняється при неможливості подальших поліпшень.

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

  • - повнота виконання специфікованих функцій;
  • - можливість швидкого і дешевого поповнення новими, що раніше не специфікованими функціями;
  • - видимість для проектувальника складових частин програми;
  • - максимальна незалежність за даними окремих частин програми;
  • - можливість зв'язування програми з великої багаторівневої схемою ієрархії конкретним редактором зв'язків (лінковщік). Якщо починається робота над новою програмою, то дуже корисно виконати на ЕОМ її модель у вигляді порожніх заглушок модулів, які не містять ніяких дій;
  • - достатність оперативної пам'яті. Тут розглядаються варіанти з описом особливо структурованих статичних і динамічних змінних на різних рівнях схеми ієрархії. Перевірка задоволення даного критерію здійснюється розрахунками з деякими машинними експериментами;
  • - оцінка впливу топології схеми ієрархії на швидкість виконання програми при використанні оверлеїв (динамічного завантаження програми) і механізму підкачки сторінок при розробці програми, яка цілком не може бути розміщена в оперативній пам'яті;
  • - відсутність різних модулів, що виконують схожі дії. В ідеалі - один і той же модуль викликається на різних рівня схеми ієрархії;
  • - досягнення при реалізації програми такого мережевого графіка роботи колективу програмістів, який забезпечує рівномірне завантаження колективу за ключовими датами проекту;
  • - всіляко скорочення витрат на тестування вже зібраного ядра програми по ключовим дат мережевого графіка реалізації. Характеризується простотою використовуваних заглушок і якістю тестування з усіх обчислювальним маршрутами модулів. Досягається первинної реалізацією зверху вниз модулів введення і виведення програми з відстрочкою реалізації інших гілок схеми ієрархії. Зазвичай витрати на тестування складають близько 60% вартості всього проекту. Хороша схема ієрархії скорочує витрати на тестування в порівнянні з первісним варіантом в 2-5 разів і більше;
  • - використанням у даному проекті якомога більшого числа розроблених в попередніх проектах модулів і бібліотек при мінімальному обсязі виготовлених заново частин;
  • - вдалий розподіл модулів по компільовані файлів програми і бібліотекам;
  • - накопичення вже готових модулів і бібліотек модулів для використання їх у всіх нових розробках.

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

функціональному підході до програмування.

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

Час появи теоретичних робіт, які обгрунтовують функціональний підхід, Відноситься до 20-м - 30-х років XX століття. Як ми переконаємося згодом, теорія часто значно випереджає практику програмування, і найважливіші роботи, які сформували математичну основу підходу, були написані задовго до появи комп'ютерів і мов програмування, які потенційно могли б реалізувати цю теорію.

Що стосується першої реалізації, то вона з'явилася в 50-х роках XX століття в формі мови LISP, про який мова піде далі.

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

функціональний підхід породив ціле сімейство мов, родоначальником яких, як уже зазначалося, став мова програмування LISP. Пізніше, в 70-х роках, був розроблений первісний варіант мови ML, який згодом розвинувся, зокрема, в SML, а також ряд інших мов. З них, мабуть, самим "молодим" є створений вже зовсім недавно, в 90-х роках, мова Haskell.

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

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

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

завдяки реалізації механізму зіставлення зі зразком, Такі мови функціонального програмування як ML і Haskell добре використовувати для символьної обробки.

Природно, мови функціонального програмування не позбавлені і деяких недоліків.

Часто до них відносять нелінійну структуру програми і відносно невисоку ефективність реалізації. Однак перший недолік досить суб'єктивний, а другий успішно подоланий сучасними реалізаціями, зокрема, низкою останніх трансляторів мови SML, включаючи і компілятор для середовища Microsoft. NET.

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

Зауважимо, що під терміном "функція" в математичній формалізації і програмної реалізації маються на увазі різні поняття.

так, математичної функцією f з областю визначення A і областю значень B називається множина впорядкованих пар

таких, що якщо

b 1 \u003d b 2.

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

Для формалізації поняття "

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

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

8.1. Структурний підхід в програмуванні.

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

Іншими факторами, що впливають на еволюцію методів проектування і створення ПП, є:

Зміна архітектур обчислювальних засобів (ВС) в інтересах підвищення
продуктивності, надійності;

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

Виділяють 5-ть джерел складності програмування:

Можна вирішити завдання;

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

Середовище виконання програми;

Технологічний процес колективної розробки і створення ПП;

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

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

У програмуванні широко використовуєтьсяфундаментальний принцип управління складними системами, який відомий людині з глибокої давнини -devide et impera (Розділяй і володарюй, лат.) І застосовується при розробці і проектуванні будь-яких складних технічних систем. Згідно з першою частиною цього принципу, при проектуванні складної програмної системи проводитьсяалгоритмічна декомпозиціярозв'язуваної задачі.

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

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

Теоретичне оформлення структурний підхід отримав на початку 70-х років в роботах теоретиків і практиків програмування (А. П. Єршова, Е. Йодана, Н.Вірта). Слід відзначити появу структурного програмування, в якому знайшла певне відображення ідея упорядкування структури програми.структурне програмуванняорієнтує на складання програм, структура яких близька до «дереву» операторів або блоків. Використання структури типу «дерево» як своєрідний еталон пояснюється тим, що це проста для аналізу і реалізації структура.

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

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

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

Розвиток мов в напрямку підвищення ефективності складання прикладних програм призвело до поділу мов за такими рівнями:

Низький рівень (машинно-орієнтовані мови - мови асемблера),

Високий рівень (процедурно-орієнтовані мови:FORTRAN, ALGOL,

PL / 1, Pascal),

Рівень розв'язуваної задачі (проблемно-орієнтовані мови -SQL).

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

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

Результатом узагальнення поняття «тип даних» єкласи об'єктів (C ++), які можуть містити як елементи не тільки дані певного типу, а й методи їх обробки (функції).

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

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

Мова програмування дозволяє описати властивості модельованих об'єктів і порядок маніпуляції з об'єктами або порядок їх взаємодії, погодившись з умовами розв'язуваної задачі. Перші мови програмування орієнтувалися на математичні об'єкти, на певну модель обчислювача. Тому вони містили такі конструкції як змінна, константа, функція, формальні і фактичні параметри. Програмісти представляли свої програми у вигляді взаємодіючих функцій і модулів. Характер програмування був процедурно-орієнтованим, оскільки першочергова увага приділялася послідовностям дій з даними. Відповідно такі мови програмування, якFORTRAN, PL -1, С називають процедурно-орієнтованими.

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

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

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

Об'єктний підхід почав розвиватися в програмуванні з 70-х років (Smalltalk, CLOS, Ada ). Ці мови називаютьсяоб'єктними. ієрархічна класифікація об'єктів та успадкування властивостей є відправними ідеями з'явився в 80-х роках об'єктно-орієнтованого підходу. Однією з причин порівняно повільного становлення об'єктно-орієнтованого стилю програмування є його суттєва відмінність від процедурно-орієнтованого стилю.

8.2. Концепції об'єктно-орієнтованого програмування.

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

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

Основним поняттям ООП єоб'єкт або клас в C ++, який можна розглядати з двох позицій. По-перше, з позиції предметної області:клас відповідає певному характерному об'єкту цій галузі. По-друге, з позиції технології програмування, що реалізує це відповідність: «клас» в ООП - це певна програмна структура, яка володіє трьома найважливішими властивостями:

інкапсуляції;

успадкування;

Поліморфізму.

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

Об'єкти і класи.

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

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

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

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

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

Інкапсуляція властивостей об'єктів.

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

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

Доступ до полів і методів об'єкта здійснюється через ім'я об'єкта і відповідні імена полів і методів за допомогою операцій вибору «.» і «-\u003e». Це дозволяє в максимальному ступені ізолювати зміст об'єкта від зовнішнього оточення, т. Е. Обмежити і наочно контролювати доступ до елементів об'єкта. В результаті заміна або модифікація полів і методів, інкапсульованих в об'єкт, як правило, не тягне за собою погано контрольованих наслідків для програми в цілому. При необхідності вказівки імені об'єкта в тілі опису цього об'єкта в C ++ використовується зарезервоване словоthis, яке в рамках об'єкта є спеціальним синонімом імені об'єкта - покажчиком на об'єкт.

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

Можна сказати, що інкапсуляція має на увазі під собою приховування даних (data hiding ), Що дозволяє захистити ці дані.

А тепер визначення, яке точно визначає суть инкапсуляции:

Змінні стану об'єкта приховані від зовнішнього світу. Зміна стану об'єкта (його змінних) можливо ТІЛЬКИ за допомогою його методів (операцій).

Чому ж це так важливо? Цей принцип дозволяє захистити змінні стану об'єкта від неправильного їх використання.

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

Для ілюстрації наведеного вище постулату розглянемо приклад.

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

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

Іменування класів, елементів даних і методів має велике значення в ООП. Назви повинні або збігатися з назвами, що використовуються в предметної області, або ясно відображати зміст або призначення (функціональність) іменованого класу, поля або методу. При цьому не слід боятися довгих імен - витрати на написання окупляться при налагодженні і супроводі продукту. Текст подібної програми стає зрозумілим без особливих коментарів. Додатковим засобом доступу до даних і методів є опис елементів класів за допомогою специфікаторівprivate, protected і public, які визначають три відповідних рівня доступу до компонентів класу: приватні, захищений і загальнодоступний.

Для розширення доступу до елементів даних, які мають атрибутиprivate або protected, в класі можна реалізувати з атрибутомpublic спеціальні методи доступу до власних і захищеним елементів даних.

Методи в класі можуть бути оголошені як дружні (friend ) Або віртуальні (virtual ). Іноді зустрічається оголошення перевантажуються (overload) функцій.

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

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

Спадкування властивостей.

спадкування є властивість класів породжувати своїх нащадків і успадковувати властивості (елементи даних і методи) своїх батьків. Клас-нащадок автоматично успадковує від батька всеелементи даних і методи, а також може містити нові елементи даних та методи і навіть замінювати (перекривати, перевизначати) методи батька або модифікувати (доповнювати) їх.

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

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

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

Сенс і універсальність спадкування полягає в тому, що не треба кожен раз заново (з нуля) описувати новий об'єкт, а можна вказати батька (базовий клас) і описати відмінні риси нового класу. В результаті, новий об'єкт буде мати всі властивості батьківського класу плюс своїми власними відмітними особливостями.

Спадкування в ООП дозволяє адекватно відображатиродинні відносиниоб'єктів предметної області. Якщо клас В має всі властивості класу А і ще має додаткові властивості, то клас А називаєтьсябазовим (Батьківським), а клас В називаєтьсяспадкоємцем класу А. У C ++ можливоодиночне (З одним батьком) імножинне (З декількома батьками) успадкування.

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

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

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

Приклади родинних класів: Координати на екрані -\u003e Кольорова точка-\u003e Пряма -\u003e Прямокутник. Тут напрямок стрілки вказує порядок спадкування властивостей класів.

При вказівці базового (батьківського) класу в описі класу вС ++ потрібно вказати ключове словоpublic . Вказівка \u200b\u200bцього ключового слова дозволить отримати вільний доступ до всіх методів класу, як якщо б вони були описані в самому похідному класі. В іншому ж випадку, ми не зможемо отримати доступ до методів батьківського класу.

Приклад опису успадкування класів наС ++:

class A

. . . . .

class B: public A

. . . . .

Поліморфізм поведінкових властивостей об'єктів.

Слово поліморфізм має грецьке походження і перекладається як "має багато форм".

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

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

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

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

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

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

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

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

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

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

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

Створення і знищення об'єктів.

Опис класу в ООП є деяка програмна структура, яку використовують при створенні об'єктів, що відрізняються іменами і окремими властивостями. Створення та видалення об'єктів здійснюється за допомогою спеціальних методів, які називаютьсяконструкторами (constructor) і деструкторами (destructor) відповідно.

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

Взаємодія об'єктів та шляхів сполучення.

Ставлення спорідненості або включення властивостей - це тільки один з багатьох типів відносин між класами. Ще одним дуже важливим типом відносин між класами і між об'єктами є відносини взаємодії або відносини «клієнт-сервер». Відносини спорідненості також мають на увазі певне ставлення взаємодії, обмежене властивістю інкапсуляції.

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

Часто зв'язок встановлюють за допомогоюпокажчиків, що робить програму схожою на структуру даних в динамічної пам'яті. Основним змістом програми є опис класів і сукупності взаємодіючих об'єктів. У бібліотеках класів для доступу об'єкта до самого себе (у собі) використовується зарезервоване словоthis, є синонімом імені об'єкта, в контексті якого воно використовується.

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

8.3. Етапи об'єктно-орієнтованого програмування.

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

У процесі програмування воб'єктно-орієнтованому стилі можна виділити наступні етапи:

  1. Визначення основних понять предметної області і відповідних їм класів, що мають певні властивості (можливі стани і дії). Обгрунтування варіантів створення об'єктів.
  2. Визначення або формулювання принципів взаємодії класів і взаємодії об'єктів в рамках програмної системи.
  3. Встановлення ієрархії взаємозв'язку властивостей споріднених класів.
  4. Реалізація ієрархії класів за допомогою механізмів інкапсуляції, успадкування та поліморфізму.
  5. Для кожного класу реалізація повного набору методів для управління властивостями об'єктів.

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

Перші три етапи і єоб'єктно-орієнтованим аналізом предметної області.

ООП володіє наступнимидостоїнствами:

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

Простота введення нових понять на основі старих;

Відображення в бібліотеці класів найбільш загальних властивостей і відносин між об'єктами моделюється предметної області;

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

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

Поліморфізм класів спрощує складання і розуміння програм;

Локалізація властивостей і поведінки на основі інкапсуляції і розмежування доступу спрощують розуміння структури програми і її налагодження;

Передача параметрів в конструкторах об'єктів підвищує гнучкість створюваних програмних систем.

Як недоліки ООП можна відзначити наступні:

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

Великі витрати часу на розробку бібліотеки класів, тому ООПце-лесообразно при створенні великих програм, а не при написанні маленьких одиничних програм;

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

Доцільність застосування технології ООП для створення конкретної програмної системи визначаєтьсядвома головними факторами:

Специфікою предметної області і розв'язуваної прикладної задачі;

Особливостями мови програмування (транслятора).

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

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

Надіслати свою хорошу роботу в базу знань просто. Використовуйте форму, розташовану нижче

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

Розміщено на http://www.allbest.ru/

Курсова робота

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

Вступ

2.1.2 Структурний підхід

2.2.2 Модульний підхід

висновок

програмування управління проектування

Вступ

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

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

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

А між тим еволюція програмного забезпечення, еволюція комп'ютерів, з усією очевидністю свідчить про те, що саме в цій сфері найяскравіше проявляються закони еволюції, закони ієрархії. Попереднє покоління програмістів навчалося програмування безпосередньо програмуванням. Програмісти мислили абстрактними категоріями (машинними двійковими кодами). Користувач отримував результат, не знаючи ходу (шляху) рішення задачі. Вихід з глухого кута спочатку був знайдений на шляху структурного (модульного) програмування, при якому завдання розчленовувалася на блоки (модулі), з яких потім складалася та чи інша програма. Формувалися бібліотеки стандартних програм, з яких, як з цеглинок, будувалися інші програми. Тут уже почав виникати абсолютно новий механізм (в програмуванні, але не в математиці і ін. Науках), при якому на певний стандартний набір цеглинок відбивалося нескінченне число просторових «образів». Послідовне проходження дерева конкретного «образу» програми, з використанням деякого набору конкретних базисних елементів, призводило до отримання конкретного результату. У програмуванні став розвиватися природний механізм, який за своїми можливостями можна порівняти, мабуть, тільки з мозком людини. При цьому одні й ті ж цеглинки могли використовуватися багаторазово, не тільки в рамках одного образу, але і при створенні інших комп'ютерних образів. Самі ж цеглинки були листям конкретних «образів». При цьому, чим складніше мережа дерев з образами, тим сильніше будуть можливості знаходити і визначати «аналогічні» образи, тим більше у комп'ютера буде «інтелектуальних» можливостей.

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

Розглянути різні підходи програмування і проектування;

Застосувати кожен з підходів при реалізації прикладної задачі.

1. Технології та парадигми програмування

1.1 Еволюція парадигми програмування

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

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

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

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

оператор_1:

Оператор_2:

Зазвичай при першому знайомстві з концепціями програмування доводитися стикаються саме з цією моделлю, і багато широко поширені мови підтримують саме її (наприклад, С, C ++, FORTRAN, ALGOL, PL / I, Pascal, Ada, Smalltalk і COBOL).

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

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

Функція_n (... функція_2 (функція_1 (дані)) ...)

Таку модель підтримують такі мови як ML і LISP.

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

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

дозволяє условіе_1 -\u003e действіе_1 дозволяє условіе_2 -\u003e действіе__2

дозволяє условіе_n -\u003e дія _n

Іноді правила записуються у вигляді «дія if дозволяє умова», коли виконувана дія записується зліва.

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

Існують і інші парадигми, що пояснюється необхідністю вирішувати різні завдання. Не можна вважати будь-яку парадигму найкращою у всіх областях практичного застосування. Наприклад, для обчислювальних задач більш придатна імперативна парадигма, а для проектування інтелектуальних систем застосовується парадигма, орієнтована на правила. В останні роки особливої \u200b\u200bпопулярності набула парадигма візуального програмування.

1.2 Структури управління і підпрограми

Теорія первинних програм була запропонована Маддуксом як узагальнення методології структурного програмування для визначення однозначної ієрархічної декомпозиції блок-схем. У цій теорії передбачається, що графи програм можуть містити три класи вузлів (малюнок 1):

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

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

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

Малюнок 1 Вузли на графі програми

Будь-яка блок-схема складається тільки з цих трьох компонентів.

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

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

2. Еволюція підходів до проектування і програмування

2.1 Структурний підхід до проектування і програмування

2.1.1 Поняття структурного програмування

Історично склалося так, що імперативні мови в даний час домінують в програмуванні. Однак дослідження, проведені в 70-80-х роках XX століття, показали, що аплікативного методика забезпечує більш ефективні способи верифікації програм і доказ їх коректності. Це видно з блок-схеми, представленої на малюнку 2.

Малюнок 2 Типова блок-схема програми 60-х років

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

Вихід з цієї кризи - перехід до структурної парадигми програмування. На малюнку 2 зображено блок-схема, типова для програм 60-х років XX століття. У ній немає ніякої явної структури. Такі програми називають про-грамами-спагетті. Через велику кількість нераціональних передач управління назад і вперед важко зрозуміти, який стан програми в кожен момент часу в процесі її виконання.

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

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

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

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

Малюнок 3 Блок-схема програми структурованої конструкції

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

2.1.2 Структурний підхід

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

а) підвищення продуктивності праці програмістів при написанні і контролі програм;

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

в) створення програм колективом розробників;

г) закінчення створення програм в заданий термін.

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

Концепція структурного програмування передбачає розбиття програми на окремі компоненти відповідно до принципу приховування інформації.

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

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

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

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

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

а) діють всі ідентифікатори, визначені усередині процедури / функції;

б) діють всі ідентифікатори навколишнього контексту, якщо їхні імена відрізняються від імен, оголошених всередині процедури / функції;

в) локальні ідентифікатори процедури / функції в зовнішньому оточенні не діють ніколи;

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

2.1.3 Методи структурного проектування

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

а) рішення приватних завдань призводять до вирішення загального завдання;

б) дана послідовність окремих дій найбільш раціональна;

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

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

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

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

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

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

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

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

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

2.2 Модульний підхід до проектування і програмування

2.2.1 Поняття модульного програмування

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

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

Модульне програмування призначене для розробки великих програм. Розробкою великих програм займається колектив програмістів. Кожному програмісту доручається розробка деякої самостійної частини програми. І він в такому випадку відповідає за конструювання всіх необхідних процедур і даних для цих процедур. Приховування даних (заборона доступу до даних з-за меж модуля) запобігає їх виконання довільного збільшення і відповідно порушення роботи програми. Для взаємодії окремих частин (модулів) програми колективу програмістів необхідно продумати тільки інтерфейс (взаємодія) сконструйованих модулів в основній програмі.

Структура модуля в термінах мови Pascal.

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

Модуль містить 4 розділи: заголовок, інтерфейсна частина (розділ оголошень), розділ реалізації і розділ ініціалізації.

UNIT<имя модуля>; (Заголовок)

INTERFACE (інтерфейсна частина)

Uses<используемые модули>;

Const<объявления глобальных констант>;

Type<объявления глобальных типов>;

Var<описание глобальных переменных>;

Procedure<заголовки(!) доступных процедур>;

Function<заголовки(!) доступных функций>;

IMPLEMENTATION (розділ реалізації)

Uses<используемые при реализации модули>;

Const<объявления скрытых (локальных) констант>;

Type<объявления скрытых (локальных) типов>;

Var<описание скрытых (локальных) переменных>;

Procedure<тела(!) скрытых (локальных) процедур>;

Function<тела(!) скрытых (локальных) функций>;

<основной блок модуля = раздел инициализации>

2.2.2 Модульний підхід

Концепцію модульного підходу можна сформулювати у вигляді декількох понять і положень:

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

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

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

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

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

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

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

Модульне проектування передбачає виділення груп підпрограм, які використовують одні і ті ж глобальні дані, в окремо компільовані модулі (бібліотеки підпрограм), наприклад, модуль графічних ресурсів. Зв'язки між модулями при використанні даної технології здійснюються через спеціальний інтерфейс, в той час як доступ до реалізації модуля (тіл підпрограм і деяким «внутрішнім» змінним) заборонений. Цю технологію підтримують сучасні версії мов Pascal і С (C ++), мови Ада і Modula.

2.3 Об'єктний підхід до проектування і програмування

2.3.1 Об'єктно-орієнтоване програмування

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

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

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

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

б) методи об'єкта, які реалізують дії (виконання алгоритмів) у відповідь на їх виклик у вигляді відданого повідомлення;

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

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

Об'єкти в програмах відтворюють всі відтінки явищ реального світу: «народжуються» і «вмирають»; змінюють свій стан; запускають і зупиняють процеси; «Вбивають» і «відроджують» інші об'єкти.

2.3.2 Об'єктно-орієнтоване проектування

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

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

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

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

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

В об'єктно-орієнтованому програмуванні принцип інкапсуляції використовується для ізоляції класу від інших частин програми, щоб зробити його самодостатнім для вирішення конкретного завдання. Наприклад, клас TForm в середовищі Delphi містить (інкапсулює в собі) все необхідне для створення Windows-вікна, клас TMemo являє собою потужний текстовий редактор, клас TTimer забезпечує роботу програми з таймером і т.д.

Інкапсуляція досягається шляхом поєднання в одному записі мови програмування структур даних з процедурами і функціями, які маніпулюють полями даних цього запису, для отримання нового типу даних ~ класу. Інкапсуляція дозволяє захистити по інтерфейсу доступ до полів і методів. Доступ дозволяється лише до відкритих методів і полях. Повна сукупність методів і тонкощі їх реалізацій є прихованими.

TMyClass \u003d class

IntField: Integer;

function MyFunc (a: Integer): Integer;

procedure MyProc; end;

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

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

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

Принцип успадкування оперує з поняттями «предок - нащадок» і передбачає розширення набору властивостей спадкоємця за рахунок прийняття всіх властивостей предка.

Будь-клас може бути породжений від іншого класу. Для цього при його оголошенні вказується ім'я класу-батька:

TChildCIass \u003d class (TParentClass)

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

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

TaClass \u003d class (TObject)<==> TaClass \u003d class

Принцип успадкування призводить до створення розгалужених дерева класів. Кожен нащадок доповнює можливості свого батька новими і передає їх своїм нащадкам. Наприклад, клас TPersistent збагачує можливості свого батька TObject тим, що він вміє зберігати дані у файлі і отримувати їх з нього, в результаті це вміють робити і все його нащадки. Клас TComponent, в свою чергу, вміє взаємодіяти з середовищем розробника і передає це вміння своїм нащадкам. TControl не тільки здатний працювати з файлами і середовищем розробника, але він ще вміє створювати і обслуговувати видимі на екрані зображення, а його нащадок TWinControl може створювати Windows-вікна і т.д.

У Object Pascal можливо тільки так зване одиночне спадкоємство, але в реальному світі у нащадка два батька, тому в ряді мов (наприклад, в C ++) передбачений механізм множинного спадкоємства. Множинне спадкування більш логічно з точки зору моделювання реального світу, проте, воно ускладнює реалізацію мов програмування.

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

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

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

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

Крім цього, в Object Pascal поліморфізм досягається не тільки механізмом успадкування і перекриття методів батька, але і їх виртуализацией, що дозволяє батьківським методам звертатися до методів своїх нащадків

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

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

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

3. Застосування різних підходів при вирішенні задач

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

Структурний підхід. Програмний код виглядає наступним чином:

program Perestanovka;

N, copy_N, number, copy_number, first, last, stepen, new_N: integer;

(Тіло програми)

(Введення числа)

write ( "input N \u003d");

(Підрахунок кількості цифр в числі)

number: \u003d number + 1;

copy_N: \u003d copy_N div 10;

if copy_N<>0 then

if number \u003d 0 then

(Обчислення ступеня числа 10 ^ (number-1))

copy_number: \u003d number;

(Виділення першої і останньої цифри)

copy_N: \u003d copy_N div 10;

copy_number: \u003d copy_number-1;

if copy_number<>1 then

copy_number: \u003d number;

(Перестановка цифр)

stepen: \u003d stepen * 10;

copy_number: \u003d copy_number-1;

if copy_number\u003e 1 then

new_N: \u003d N-first * stepen + last * stepen-last + first;

(Висновок результату)

Код лінійний, всі дії виконуються послідовно, передача управління здійснюється за рахунок використання оператора переходу goto.

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

program Perestanovka;

(Розділ оголошення змінних)

N, number, new_N: integer;

(Розділ оголошення процедур і функцій)

(Процедура підрахунку кількості цифр в числі)

while NN<>0 do

(Функція визначення першої цифри числа)

while kol<>1 do

first_cifra: \u003d NN;

(Функція визначення останньої цифри числа)

last_cifra: \u003d NN mod 10;

(Функція зведення цілого числа в цілу ступінь)

while pokaz<>0 do

(Тіло програми)

write ( "input N \u003d");

kol_cifr (number, N);

if number<>0 then

new_N: \u003d N-first_cifra (N, number) * stepen (10, number-1) +

last_cifra (N) * stepen (10, number-1) -

last_cifra (N) + first_cifra (N, number)

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

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

Program perestanovka;

number: integer;

procedure input;

procedure output;

procedure kol_cifr (var kol: integer; NN: integer);

procedure perestavka (var NN: integer; cf, cl: integer);

function first_cifra (NN: integer; kol: integer): integer;

function last_cifra (NN: integer): integer;

function stepen (bas: integer; pokaz: integer): integer;

while pokaz<>0 do

procedure tN.input;

write ( `input N \u003d");

readln (N.znach);

procedure tN.kol_cifr (var kol: integer; NN: integer);

while NN<>0 do

function tN.first_cifra (NN: integer; kol: integer): integer;

while kol<>1 do

first_cifra: \u003d NN;

function tN.last_cifra (NN: integer): integer;

last_cifra: \u003d NN mod 10;

procedure tN.perestanovka (var NN: integer; cf, cl: integer);

NN: \u003d NN-cf * stepen (10, number-1) + cl * stepen (10, number-1) -cl + cf;

procedure tN.output;

Form1.Edit1.Clear;

Form1.Edit1.Text: \u003d inttostr (N.znach);

N.kol_cifr (N.number, N.znach);

if N.number<>0 then

N.perestanovka (N.znach, N.first_cifra (N.znach, N.number), N.last_cifra (N.znach));

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

висновок

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

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

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

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

Список використаних джерел

1. Буч, Г. Об'єктно-орієнтований аналіз та проектування з прикладами на С ++ / Г. Буч, переклад з англ. під ред. І. Романовського і Ф. Андрєєва. - М .: Вільямс, 2008. - 721 с.

2. Архангельський, А.Я. Програмування в Delphi 7 / А.Я. Архангельський. М .: ТОВ «Біном-Пресс», 2003., - 1152 с.

3. Програмування. Лекції з програмування. - Режим доступу www.studifi.ru

4. Технологія програмування. Структурний і об'єктно-орієнтоване. - Режим доступу www.sgm.forumssity.ru

5. Технологія структурного програмування. . - Режим доступу www.razlib.ru

6. On-line Інформатика. Модульне програмування. - Режим доступу www.online-ane.ru.

Розміщено на Allbest.ru

...

подібні документи

    Розгляд існуючого підходу до проектування пакувальної продукції. Методи розробки з використанням засобів автоматизованого проектування. Огляд ринку конструкцій для розміщення рекламних буклетів. Виконання ескізів в графіку і в обсязі.

    дипломна робота, доданий 28.08.2014

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

    дипломна робота, доданий 04.06.2009

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

    курсова робота, доданий 27.11.2012

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

    реферат, доданий 18.02.2009

    Опис САПР "Ассоль" - модульного програмного комплексу, який дозволяє за ескізом, фотографії або зразком швидко і точно розробити лекала моделей будь-якої складності. Комбінаторний синтез технічного ескізу. Сфера застосування "Ассоль-Дизайн".

    навчальний посібник, доданий 07.02.2016

    Склад атмосферного сушіння. Технічна характеристика сушильної камери "Інтер-Урал". Основні вимоги до проектування цеху. Технологічний процес виготовлення виробів з пиломатеріалів. Виробнича програма деревопереробного цеху.

    курсова робота, доданий 13.07.2015

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

    курсова робота, доданий 17.05.2012

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

    презентація, доданий 09.12.2015

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

    реферат, доданий 18.02.2009

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