tehnologia (1018792), страница 25
Текст из файла (страница 25)
§ 5.2).Структурными компонентами программной системы или программного комплексамогут служить программы, подсистемы, базы данных, библиотеки ресурсов и т. п.Структурная схема программного комплекса демонстрирует передачу управления отпрограммы-диспетчера соответствующей программе (рис. 5. 1).Структурная схема программной системы, как правило, показывает наличиеподсистем или других структурных компонентов. В отличие от программного комплексаотдельные части (подсистемы) программной системы интенсивно обмениваются даннымимежду собой и, возможно, с основной программой. Структурная же схема программнойсистемы этого обычно не показывает (рис. 5.2).Более полное представление о проектируемом программном обеспечении с точкизрения взаимодействия его компонентов между собой и с внешней средой даетфункциональная схема.Функциональная схема. Функциональная схема или схема данных (ГОСТ 19.701 90) - схема взаимодействия компонентов программного обеспечения140с описанием информационных потоков, состава данных в потоках и указаниемиспользуемых файлов и устройств.
Для изображения функциональных схем используютспециальные обозначения, установленные стандартом. Основные обозначения схем данныхпо ГОСТ 19.701-90 приведены в табл. 5.1.Функциональные схемы более информативны, чем структурные. На рис. 5.3 длясравнения приведены функциональные схемы программных комплексов и систем.141Все компоненты структурных и функциональных схем должны быть описаны. Приструктурном подходе особенно тщательно необходимо прорабатывать спецификациимежпрограммных интерфейсов, так как от качества их описания зависит количество самыхдорогостоящих ошибок.
К самым дорогим относятся ошибки, обнаруживаемые прикомплексном тестировании,142так как для их устранения могут потребоваться серьезные изменения уже отлаженныхтекстов.5.2. Использование метода пошаговой детализации для проектирования структурыпрограммного обеспеченияСтруктурный подход к программированию в том виде, в котором он былсформулирован в 70-х годах XX в., предлагал осуществлять декомпозицию программметодом пошаговой детализации.
Результатом декомпозиции является структурная схемапрограммы, которая представляет собой многоуровневую иерархическую схемувзаимодействия подпрограмм по управлению. Минимально такая схема отображает двауровня иерархии, т. е. показывает общую структуру программы. Однако тот же методпозволяет получить структурные схемы с большим количеством уровней.Метод пошаговой детализации (см. § 1.3) реализует нисходящий подход (см. § 2.3) ибазируется на основных конструкциях структурного программирования (см.
§ 2.4). Онпредполагает пошаговую разработку алгоритма. Каждый шаг при этом включает разложениефункции на подфункции. Так на первом этапе описывают решение поставленной задачи,выделяя общие подзадачи, на следующем аналогично описывают решение подзадач,формулируя при этом подзадачи следующего уровня. Таким образом, на каждом шагепроисходит уточнение функций проектируемого программного обеспечения. Процесспродолжают, пока не доходят до подзадач, алгоритмы решения которых очевидны.Декомпозируя программу методом пошаговой детализации, следует придерживатьсяосновного правила структурной декомпозиции, следующего из принципа вертикальногоуправления: в первую очередь детализировать управляющие процессы декомпозируемогокомпонента, оставляя уточнение операций с данными напоследок. Это связано с тем, чтоприоритетная детализация управляющих процессов существенно упрощает структурукомпонентов всех уровней иерархии и позволяет не отделять процесс принятия решения отею выполнения: так, определив условие выбора некоторой альтернативы, сразу же вызываютмодуль, ее реализующий.Детализация операций со структурами в последнюю очередь позволит отложитьуточнение их спецификаций и обеспечит возможность относительно безболезненноймоди4'икации -лих структур за счет сокращения количества модулей, зависящих от этихданных.Кроме этого, целесообразно придерживаться следующих рекомендаций:• не отделять операции инициализации и завершения от соответствующей обработки,так как модули инициализации и завершения имеют плохую связность (временную) исильное сцепление (по управлению);143• не проектировать слишком специализированных или слишком универсальныхмодулей, так как проектирование излишне специальных модулей увеличивает их количество,а проектирование излишне универсальных модулей повышает их сложность;• избегать дублирования действий в различных модулях, так как при их измененииисправления придется вносить во все фрагменты программы, где они выполняются - в этомслучае целесообразно просто реализовать эти действия в отдельном модуле;• группировать сообщения об ошибках в один модуль по типу библиотеки ресурсов,тогда будет легче согласовать формулировки, избежать дублирования сообщений, а такжеперевести сообщения на другой язык.При этом, описывая решение каждой задачи, желательно использовать не более 1-2-хструктурных управляющих конструкций, таких, как цикл-пока или ветвление, что позволяетчетче представить себе структуру организуемого вычислительного процесса.Пример 5.1.
Разработать алгоритм программы построения графиков функций однойпеременной на заданном интервале изменения аргумента [x1, х2] при условии непрерывностифункции на всем интервале определения.Примечание. Для того чтобы программировать построение графиков функций с точками разрывапервого и второго рода, необходимо аналитически исследовать заданные функции, что представляет собойотдельную и достаточно сложную задачу.
Численными методами данная задача не решается.В общем виде задача построения графика функции ставится как задача отображенияреального графика (рис. 5.4, о), выполненного в некотором масштабе, в соответствующееизображение в окне на экране (рис. 5.4, б).144Для построения графика необходимо определить масштабы по осям координат:mx =wx1 − wx 2,x1 − x 2my =wy 1 − wy 2y max − y minи координаты точек графика:px i =py i =⎡(xi − x1 ) ∗ m x ⎤ + wx1 ,⎡( y max − yi ) ∗ m y ⎤ + wy1 ,Шаг координатной сетки по вертикали и горизонтали при этом можно определить поформулам:lpm x =wx 2 − wx1,nl xlpm y =wy 2 − wy 1nl yгде nlx nly - соответственно количество вертикальных и горизонтальных линий.Для разметки сетки необходимо определить шаги разметки по горизонтали ивертикали:lm x =x 2 − x1,nl xlm y =x max − x minnl yТаким образом, для того чтобы построить график, необходимо задать функцию,интервал изменения аргумента [x1, х2], на котором функция непрерывна, количество точекграфика n, размер и положение окна экрана, в котором необходимо построить график: wx1,wy1, wx2, wy2 и количество линий сетки по горизонтали и вертикали nlx, nly.
Значения wx1,wy1, wx2, wy2, nlx, nly можно задать, исходя из размера экрана, а интервал и число точекграфика надо вводить.Разработку алгоритма выполняем методом пошаговой детализации, используя длязаписи псевдокод.Примем, что программа будет взаимодействовать с пользователем черезтрадиционное иерархическое меню, которое содержит пункты: Функция, Отрезок, Шаг, Видрезультата. Выполнить и Выход (см. рис. 8.5). Для каждого пункта этого меню необходимореализовать сценарий, предусмотренный в техническом задании.Шаг 1. Определяем структуру управляющей программы, которая для нашею случаяреализует работу с меню через клавиатур:145Программа.Инициализировать глобальные значенияВывести заголовок и менюВыполнятьЕсли выбрана Командато Выполнить Командуиначе Обработать нажатие клавиш управленияВсе - еслидо Команда = Выход Конец.Очистка экрана, вывод заголовка и меню, а также выбор Команды - операциисравнительно простые, следовательно, их можно не детализировать.Шаг 2.
Детализируем операцию Выполнить команду:Выполнить Команду:Выбор КомандаФункция:Ввести или выбрать формулу FunВыполнить разбор формулыОтрезок:Ввести значения х1,х2Шаг:Ввести значения hВид результата:Ввести вид _результатаВыполнить:Рассчитать значения функцииЕсли Вид_результата = Графикто Построить графикиначе Вывести таблицуВсе – еслиВсе – выборОпределим, какие фрагменты имеет смысл реализовать в виде подпрограмм. Вопервых, фрагмент Вывода заголовка и меню, так как это достаточно длинная линейнаяпоследовательность операторов и её выделение в отдельную процедуру позволит сократитьуправляющую программу. Во-вторых, фрагменты Разбор формулы, Расчет значенийфункции, Построение графика и Вывод таблицы, так как это достаточно сложные операции.Это – программы первого уровня, которые определяют структуру программы (рис.
5.5).Определим для этих программ интерфейсы по данным с основной программой, т.е. спискипараметров.146Подпрограмма Вывод заголовка и меню параметров не предполагает.Подпрограмма Разбор формулы должна иметь два параметра: Fun - аналитическоезадание функции, Tree - возвращаемый параметр - адрес дерева разбора.Подпрограмма Расчет значений функции должна получать адрес дерева разбора Tree,отрезок: значения х1 и х2, а также шаг h. Обратно в программу она должна возвращатьтаблицу значений функции Х(n) и Y(n), где n - количество точек функции.Подпрограммы Вывода таблицы и Построения графика должны получать таблицузначений функции и количество точек.После уточнения имен переменных алгоритм основной программы будет выглядетьследующим образом:Программа.Вывод заголовка и менюВыполнятьЕсли выбрана Команда тоВыбор Команда Функция:Ввести или выбрать формулу FunРазбор формулы (Fun; Var Tree) Отрезок:Ввести значения xl,x2 Шаг:Ввести значения hВид результата:Ввести вид_результата Выполнить:Расчет значений функции (xl, x2, k, Tree; VarX,Y,n)147Если Вид_резулыпата=График тоПостроение графика(Х, Y, п)иначе Вывод таблицы(Х, Y, п)Все-еслиВсе-выбориначе Обработать нажатие клавиш управленияВсе-еслидо Команда=ВыходКонец.На следующих шагах необходимо выполнить детализацию алгоритмов подпрограмм.Детализацию выполняют, пока алгоритм программы не станет полностью понятен.
Один извозможных вариантов полной структурной схемы данной программы показан на рис. 5.6.Как уже упоминалось в § 2.4, использование метода пошаговой детализации обеспечиваетвысокий уровень технологичности разрабатываемого программного обеспечения, так как онпозволяет использовать только структурные способы передачи управления.148Разбиение на модули при данном виде проектирования выполняется эвристически, исходяиз рекомендуемых размеров модулей (20-60 строк) и сложности структуры (две-тривложенных управляющих конструкции).
В принципе в качестве модуля (подпрограммы)можно реализовать решение подзадач, сформулированных на любом шаге процессадетализации, однако определяющую роль при разбиении программы на модули играютпринципы обеспечения технологичности модулей, рассмотренные в § 2.2.Для анализа технологичности полученной иерархии модулей целесообразно использоватьструктурные карты Константайна или Джексона.5.3. Структурные карты КонстантайнаНа структурной карте отношения между модулями представляют в виде графа, вершинамкоторого соответствуют модули и общие области данных, а дугам - межмодульные вызовы иобращения к общим областям данных.Различают четыре типа вершин (рис.
5.7):• модуль - подпрограмма,• подсистема - программа,• библиотека - совокупность подпрограмм, размещенных в отдельноммодуле,• область данных - специальным образом оформленная совокупностьданных, к которой возможно обращение извне.При этом отдельные части программной системы (программы, подпрограммы) могутвызываться последовательно, параллельно или как сопрограммы (рис. 5.8).Чаще всего используют последовательный вызов, при котором модули, передавуправление, ожидают завершения выполнения вызванной программы или подпрограммы,чтобы продолжить прерванную обработку.Под параллельным вызовом понимают распараллеливание вычислений на несколькихвычислителях, когда при активизации другого процесса данный процесс продолжает работу(рис.