Процедурна декомпозиція програм, застосування підпрограм в мові високого рівня Паскаль (Лабораторна робота № 4), страница 3

Предметну область програми, що розроблюється, можна визначити, як „Малювання принципових електричних схем”.

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

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

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

1.  „Малювання резистора”

2.  „Малювання конденсатора”

3.  „Малювання індуктивності”

4.  „Малювання клеми”

5.  „Малювання вузла”

6.  „Малювання лінії”

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

Детальний аналіз кожної з підзадач та визначення їх інтерфейсу

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

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

Розглянемо задачу „малювання резистора”. Відповідну процедуру слід писати таким чином, щоб вона могла бути застосована до малювання всіх 4-х резисторів, що присутні на схемі (рис. 4.1). Спільним у всіх випадках є форма резистора, а відрізняються – місцеположення та орієнтація. Таким чином