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

Учебное пособие 1295

.pdf
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
949.61 Кб
Скачать

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

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

Procedure распределение_по_страницам; repeat

печатать_заголовок_страницы;

while not конец—страницы and not1конец_отчета do взять—строку—отчета;

печатать_строку_отчета; печатать—конец—страницы until конец_отчета

end.

Если программа распределения по страницам используется в виде подпрограммы, она при каждом обращении должна, быть организована так, чтобы выполнять одну из следующих трех функций: печатать заголовок страницы, печатать строку отчета или печатать окончание страниц. В этой программе должна быть предусмотрена переменная состояния, которая указывает, какую из трех функций необходимо выполнить. Эта переменная состояния инициализируется таким образом, чтобы при первом вызове подпрограмма печатала заголовок страницы. В описанном случае используется моделирование переходов состояний, поскольку применяется переменная состояния, управляющая работой программы и содержащая лишь конеч-

91

ное число заранее определенных значений. Подпрограмма имеет следующий вид:

procedure распределение-no-страницам (строка-отчета); initial состояние = начало;

if состояние = конец; печатать_конец_страницы; состояние=начало;

if соcтояние:=начало печатать_начало_страницы; состояние: = продолжение; if состояние=продолжение печатать_строку_отчета;

if конец—страницы состояние:=конец;

if конец—отчета печатать_конец_страницы end.

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

3.5. Методы проектирования программ

Методы проектирования программ, основанные на модульном принципе, делятся на три группы: методы нисходящего проектирования, методы расширения ядра и методы восходящего проектирования. На практике обычно применяются различные сочетания этих методов.

3.5.1. Метод нисходящего проектирования

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

92

дут окончательно уточнены. Метод нисходящего проектирования, иногда называемый функциональной декомпозицией, основан на двух стратегиях: пошаговом уточнении, разработанном Е. Дейкстроем, и анализе сообщений, базирующемся на работах Подана, Константайна и Мейерса. Эти стратегии отличаются способами определения начальных спецификаций, методами, используемыми при разбиении задачи на части, и правилами записи.

Пошаговое уточнение

При пошаговом уточнении на каждом следующем этапе декомпозиции определяются программы очередного, более низкого уровня. Для этого используются процедурные языки программирования.

Во-первых, задается заголовок программы, соответствующий ее главной функции, например:

procedure обработка_пакетов

Затем определяются основные шаги обработки пакетов информации:

procedure обработка_пакетов; сортировать-записи-по-управляющим-полям; отделить-правильные-записи-от-неправильных-и-

обработать

endprocedure.

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

procedure обработка-пакетов; сортировать-записи-по-управляющим-полям; взять-первую-запись

while не-конец (входной-файл) do взять-правильную -управляющую -группу обработать-группу-записей

endwhile;

93

обработать-неправильные-управляющие-группы endprocedure.

Операция сортировки не разбивается на шаги, так как для ее выполнения часто применяется имеющаяся в системе программа сортировки. Если же такой подпрограммы нет, ее следует написать и оформить в виде независимого модуля. Создание подпрограммы сортировки включает выбор алгоритма. Но выбранный метод сортировки должен быть изолирован от остальной части программы. Однако не все расширения можно откладывать на более поздний срок. Допустим, что отсортированная информация помещается в файл с последовательным доступом (вполне естественное предположение для рассматриваемых условий). Если метод доступа к данным на этой стадии проектирования неизвестен, можно использовать какое-либо нейтральное выражение, такое, как while еще-есть- данные do.

На следующей стадии уточнения можно приостановить определение каких-либо других предложений, выделяя их в вызываемые функции и процедуры в том случае, если они функционально независимы от основной процедуры обработки или если необходимо отложить их детализацию:

procedure обработка-пакетов; сортировать-записи-по-управляющим-полям; взять-первую-запись;

while не-конец (входной-файл) do repeat взять-управляющую- группу

antil найдена-правильная-группа или конец-файла (входной-файл) обработать-заголовок-группы:

обработать-записи-группы; обработать-окончание-группы endwhile;

обработать-неправильные-управляющие-группы endprocedure,

94

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

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

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

Разбиение на модули осуществляется эвристическим способом. На каждом этапе проектирования по возможности не уточняются операции с данными (эти вопросы откладываются на более поздние сроки). Но выбор управляющих конструкций нельзя откладывать, так как на последующих этапах труднее изменить ранее выбранные конструкции. Нельзя сказать, что этот метод полностью независим от языка. Так, например, решение об использовании первоначального чтения из файла зависит от определяемого языком программирования способа обработки условия конца файла. Кроме того, некоторые конст-

95

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

Приведенный выше пример процедуры пошагового уточнения иллюстрирует основные принципы данного метода проектирования программ. Но дальнейшее уточнение нельзя проводить без рассмотрения конкретных прикладных особенностей программы: без распределения по страницам, если целью обработки является выдача отчета; без определения главного файла, если объектом проектирования служит программа сопровождения главного файла или программа, формирующая запросы к этому файлу; без детализации обработки ошибок. На этапе, когда принимается решение о прекращении дальнейшего уточнения, оставшиеся неопределенными подфункции становятся вызываемыми функциями или процедурами, а проектируемый модуль — управляющим модулем.

Преимущество метода пошагового уточнения заключается в том, что основное внимание при его использовании обращается на проектирование корректной программы, а не только на детальное понимание задачи.

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

Анализ сообщений

Анализ сообщений основывается на анализе потока данных, обрабатываемых программой. Этот вид анализа в большей степени относится к процессам передачи и преобразования отдельных записей запросов или других входных элементов, чем к операциям управления потоком данных.

Шаги, выполняемые при идентификации потоков данных и процессов, аналогичны соответствующим шагам в про-

96

ектировании систем. Первоначальный поток данных разбивается на три потока: первый содержит не преобразованные входные данные, а последний — только выходную информацию. Границы, разделяющие эти потоки, показаны на рис. 3.5 в виде штриховых линий, которые делят схему на три части. Данные, подлежащие обработке с помощью процесса, обозначенного кружком, могут не включать всю исходную информацию, но эту информацию еще можно считать частью входных данных. Квадратик, представляющий обработку, обозначает процессы кодирования, декодирования, расчета, а также другие преобразования данных. Результаты, выходящие из квадратиков, представляющих обработку, являются еще не отредактированными и не отформатированными данными и могут содержать некоторые результаты, которые впоследствии уничтожаются как неправильные, но при этом могут считаться выходными.

Входные

 

 

 

 

 

Результаты

 

Проверка

 

Обработка

 

 

Проверка

данные

 

 

 

 

 

 

 

пакетов

 

пакетов

 

 

результатов

 

 

 

 

 

 

 

Неправиль-

Неправиль-

 

 

 

 

 

 

ные

 

 

 

 

 

 

 

 

ные пакеты

 

 

 

 

 

 

Печать

 

 

 

 

 

 

 

 

 

 

ошибок

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Запоминание

 

 

 

Печать

 

 

 

 

 

 

 

 

 

 

 

правильных

 

 

 

 

 

 

 

 

 

 

 

ошибок

 

Сообщения об

 

 

результатов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ошибках

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3.5. Потоки данных для программы пакетной обработки

Три части программы принято называть соответственно истоком, преобразователем и стоком. Преобразователь пред-

97

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

Метод разбиения на исток, преобразователь и сток, рекурсивно используемый на отдельных ветвях древовидной структуры модулей, представляет собой процесс декомпозиции программы, в результате которого получаются модули нижнего уровня. Не все модули подвергаются разбиению на три части более низкого уровня. Результат декомпозиции модуля-стока должен содержать сток, модуля-преобразователя - преобразователь, а модуля-истока — исток. Однако в модуле-истоке, например, не обязательно должны содержаться части, выполняющие функции преобразователя или стока. Вызывающий модуль действует как главный сток для данных модуля-истока и как главный исток для модуля-стока. Оба они будут истоком и стоком для модуля-преобразователя. Если какой-либо преобразователь использует информацию от нескольких истоков, один из них является вызывающей программой, а другие - подмодулями истока.

 

А

 

В

 

С

 

 

 

 

 

 

 

Исток

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

Сток

Рис. 3.6. Анализ сообщений

98

На рис. 3.7 приведена иерархическая структура модулей для программы обработки пакетов. Поскольку объектом обработки является пакет, структура отображает процесс обработки одного пакета. Если все правильные записи пакета (независимо от того, содержатся ли среди них неправильные записи) подлежат обработке, объектом обработки была бы запись. Этап сортировки информации и этап выдачи протокола выходят за рамки этой схемы, так как их выполнение не влияет на процесс обработки групп записей и результаты этих этапов несущественны для обработки пакетов корректных данных. Программы, реализующие эти этапы, связаны с рассматриваемой здесь программой только с помощью файлов, поэтому их правильнее считать отдельными частями системы, чем подпрограммами. Если иерархическую структуру дополнять еще одним уровнем, сортировка должна стать истоком, структура, приведенная на рис. 3.7,б - преобразователем, а выдача протокола ошибок - стоком.

Не все модули структуры используются для обработки полного объема считанной информации. Каждый модуль при информационном обмене использует определенную часть данных. Описание иерархической структуры должно содержать таблицу взаимодействия модулей, показывающую передачу данных между различными модулями. В этой таблице должны быть определены все способы информационного обмена, задаваемые как с помощью явного вызова процедур, так и через общие и внешние накопители. Если элементы данных, заданные на некотором уровне иерархии, явным образом используются на том же уровне, в таблице отмечается их передача по всем управляющим линиям этого уровня.

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

99

Обработка данных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Чтение

 

Обработка

 

 

 

 

Запоминание

 

 

правильного

 

пакета

 

 

 

 

правильных

 

 

 

пакета

 

 

 

 

 

 

 

 

 

результатов

 

 

 

а)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обработка данных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Чтение пра-

 

Обработка

 

 

Запоминание пра-

 

вильного пакета

 

пакета

 

 

вильных результатов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Чтение

 

 

 

 

 

 

 

Чтение

 

 

 

Проверка

 

 

 

пакета

 

 

 

 

 

 

записи

 

 

 

результатов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Проверка

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обработка

 

 

 

 

Запоминание

 

пакета

 

 

 

 

 

 

 

 

 

 

 

 

 

 

записи

 

 

 

неправильного

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пакета

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Запоминание

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

неправильного

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пакета

 

 

б)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3.7. Анализ сообщений при проектировании программы пакетной обработки: а - декомпозиция первого уровня;

б - расширенная декомпозиция

100