Файл: Технология раработки програмного обеспечения УП.pdf

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 
 

51

DRIVER: procedure
          

Выполнить задачу A; 

          do while (

условие истинно); 

            

Выполнить задачу B; 

          end
          

Выполнить задачу C; 

        end DRIVER; 

Затем

более

подробно

представляются

каждый

из

опера-

торов

псевдокода

и

разрабатываются

другие

модули.

Например,

если

задачи

A,

B,

C

достаточно

сложны,

их

можно

оформить

как

отдельные

процедуры.

В

этом

случае

проект

драйвера

мож-

но

представить

следующим

образом:

DRIVER: procedure
          

Инициировать задачу A; 

          call A; 
          do while (

условие истинно); 

            

Инициировать задачу B; 

            call B; 
            end; 
          

Инициировать задачу C; 

          call C; 
        end DRIVER; 

Затем,

таким

же

образом,

можно

определить

процедуры

A,

B

и

C.

Очевидно,

что

язык

PDL

хорошо

подходит

для

нис-

ходящего

проектирования.

Нисходящее

проектирование

также

называют

пошаговым

совершенствованием:

программы

иерархически

структуриру-

ются

и

разбиваются

путем

последовательного

уточнения.

На

каждом

шаге

функционирование

модуля

описывается

с

помо-

щью

ссылок

на

предыдущие

более

подробные

шаги. 

При

восходящем

проектировании

вначале

проектируются

программы

нижнего

уровня.

Обычно

такой

подход

использует-

ся

при

проектировании

операционных

систем,

где

самым

ниж-

ним

уровнем

иерархии

являются

аппаратные

средства

(техноло-

гия

виртуальных

машин).

Например,

один

из

модулей

может

обеспечить

доступ

к

аппаратным

средствам

страничного

меха-


background image

 
 

52

низма

ЭВМ

и

предоставить

виртуальную

память

для

всех

ос-

тальных

модулей.

Вследствие

этого

большинство

систем

реаль-

ного

времени

проектируется

снизу

вверх.

На

этапах

кодирования

и

тестирования

ситуация

проти-

воположная.

Хотя

большинство

систем

проектируется

сверху

вниз,

кодирование

и

тестирование

удобнее

осуществлять

снизу

вверх,

так

как

модули

ААА

и

ААВ

не

вызывают

других

компо-

нент,

их

кодируют

и

тестируют

(рис.

4.3).

Рис.

4.3

Восходящее

кодирование

и

тестирование

Когда

задача

хорошо

определена,

пользоваться

этим

под-

ходом

очень

удобно.

Однако

если

решаемая

задача

не

понятна

или

детально

не

определена,

то

тестирование

снизу

вверх

может

вызвать

серьез-

ные

проблемы.

Например,

пользователь

не

может

убедиться

в

правильности

функционирования

системы

согласно

специфика-

циям,

пока

не

будет

проверен

модуль

верхнего

уровня.

Однако

этого

нельзя

сделать

до

тех

пор,

пока

не

будет

проверена

вся

иерархическая

структура

системы,

т.е.

до

завершения

проекта.

А

внесение

изменений

на

этом

этапе

сопряжено

со

значитель-

ными

затратами

и

обходится

дорого.

Чтобы

избежать

этого,

можно

использовать

нисходящее

кодирование.

В

этом

случае

в

первую

очередь

проверяют

моду-

ли

управляющей

программы,

а

также

модули

A,

B,

C.

Пользо-

ватель

системы

проверяет

функционирование

верхнего

уровня

DRIVER

AAA

AAB

AA

AC

AB

A

B

C


background image

 
 

53

на

начальном

этапе

разработки,

поэтому

сделать

любые

необ-

ходимые

изменения

в

спецификациях

гораздо

легче. 

Единственное

неудобство

при

таком

методе

кодирования

заключается

в

том,

что

для

проверки

модулей

A,

B,

C

требуют-

ся

также

модули

АА,

АВ,

АС,

ВА,

ВВ

и

СА.

Для

этих

целей

служат

подыгрывающие

программы

заглушки.

Это

короткие

программы,

которые

составляются

специально

для

того,

чтобы

моделировать

ненаписанные

модули

и

передавать

управляю-

щим

программам

необходимые

тестовые

данные

(рис.

4.4).

Рис.

4.4

Нисходящее

тестирование

Подобные

средства

оказываются

полезными,

если

ими

пользоваться

достаточно

осторожно,

так

как

корректность

сис-

темы

не

может

быть

доказана,

пока

не

убрана

последняя

за-

глушка.

Нисходящее

проектирование

не

так

просто,

как

это

ка-

жется

на

первый

взгляд.

Это

связано

с

тем,

что

в

любой

про-

граммной

системе

имеется

три

вершины:

1)

начало

работ;

2)

управляющая

программа;

3)

программа

связи

пользователя

с

системой.

Основные

различия

между

этими

моментами

можно

пока-

зать

на

примере

компилятора.

Для

разработчика

аппаратных

средств

«вершиной»

системы

является

модуль,

инициирующий

работу

системы.

Этот

модуль

основное

средство

интерфейса

с

операционной

системой.

С

его

помощью

с

диска

считываются

фрагменты

программы,

реализующие

различные

этапы

компи-

лирования,

и

передается

управление

на

их

выполнение.

Все

ос-

DRIVER

AA

STUB

AC

STUB

AB

STUB

A

BA

STUB

BB

STUB

B

CA

STUB

C


background image

 
 

54

тальные

части

системы

можно

рассматривать

как

подпрограм-

мы

этого

модуля.

Для

системного

программиста

«вершиной»

является

управляющая

программа.

В

компиляторе

«вершиной»

можно

считать

основной

цикл

анализа,

который

осуществляет

поиск

очередного

анализируемого

оператора

(лексемы).

Таким

обра-

зом,

логической

вершиной

является

цикл

вида:

do while 

(

продолжить до конца 

компилирования); 

  

Чтение до начала следующего оператора; 

  

Анализ введенного оператор; 

end

Что

касается

пользователя,

то,

с

его

точки

зрения,

компи-

лятор

читает

операторы,

а

затем

их

транслирует.

Таким

обра-

зом,

для

него

«вершиной»

является

программа

ввода

данных.

От

искусства

и

квалификации

программиста

зависит

пра-

вильный

выбор

вершины

для

всей

системы.

Однако

для

при-

кладных

программ

всегда

целесообразно

«вершиной»

считать

управляющую

программу.

При

нисходящей

разработке

пользователь

видит

взаимо-

действие

верхних

уровней

системы

на

начальных

этапах.

Изме-

нения

в

этот

период

можно

вносить

относительно

легко.

Таки-

ми

же

свойствами

обладает

и

метод

последовательной

моди-

фикации

(модернизации).

При

использовании

этого

метода

вна-

чале

проектируется

и

реализуется

некоторый

вариант

системы.

Пользователь

очень

быстро

получает

работающую

систему.

Процесс

модернизации

с

последующим

расширением

функций

системы

продолжается

до

тех

пор,

пока

не

будет

получена

окончательная

версия.

4.2.2 Структурное проектирование 

Одним

из

эффективных

методов

разработки

программ

яв-

ляется

метод

пошагового

совершенствования.

Использование

PDL

хорошо

согласуется

с

этим

методом.

Программист

обду-

мывает

проект

задачи

все

более

детально,

причем

каждый

шаг

является

«интеллектуально

управляемой»

компонентой

задачи.


background image

 
 

55

Вначале

программист

представляет

задачу

как

набор

за-

дач:

do

 task A; 

do

 task B; 

do

 task C; 

 
Каждая

из

задач

определяется

и

детализируется

с

помо-

щью

спецификаций.

Каждую

небольшую

задачу

можно

пред-

ставить

в

виде

нескольких

предложений

PDL,

входящих

в

не-

которую

процедуру.

Если

задача

сложная,

ее

можно

предста-

вить

как

отдельную

процедуру.

При

детализации

каждой

задачи

можно

пользоваться

только

операторами

PDL.

Выбор

операторов

этого

языка

не

случаен

они

обеспечивают

управляемые

конструкции

проек-

тируемых

программ.

При

этом

программы

рассматриваются

как

функции.

Любой

оператор

можно

представить

в

виде

y = f(x).

задачах

со

многими

переменными

x

и

y

векторы

с

соответст-

вующим

числом

компонент.)

Таким

образом,

оператор

при-

своения 

А = В + С·D 

 
можно

представить

в

виде

F(X,  Y,  Z) = X + Y·Z

и

заменить

его

следующим

оператором:

A = F(XYZ).

Аналогичным

образом

можно

представить

оператор

лю-

бой

степени

сложности.

Таким

образом,

каждую

программу

можно

записать

как

функцию,

преобразующую

входные

пере-

менные

в

выходные.

Для

формализации

процесса

нисходящей

разработки

вво-

дится

понятие

 «

простая

программа».

Простая

программа

опре-

деляется

как

программа,

которую

можно

представить

в

виде

структурной

схемы

со

следующими

свойствами:

1)

существуют

только

одна

входная

и

одна

выходная

ду-

ги;

2)

для

каждого

узла

существует

путь

от

входной

дуги

че-

рез

этот

узел

к

выходной

дуге

(рис.

4.5,

4.6).