logo search
ТППС / Магистры / ТППС-лаб

4. Проектування і реалізація пз

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

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

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

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

Нижче перераховані окремі етапи процесу проектування.

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

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

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

  4. Компонентне проектування. Проводиться розподіл системних функцій (сервісів) по різних компонентах і їх інтерфейсам.

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

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

Рис. 1.9. Узагальнена схема процесу проектування

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

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

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

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

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

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

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

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

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

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

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

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

Програмування і налагодження

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

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

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

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

Рис. 1.10. Процес налагодження

  1. Атестація програмних систем

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

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

Рис. 1.11. Процес тестування

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

Процес тестування складається з декількох етапів.

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

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

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

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

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

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

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

Рис. 1.12. Етапи тестування в процесі розробки ПЗ

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

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