Учебное пособие 1438
.pdfопределяется порядок разработки информационной системы. При моделировании используются диаграммы декомпозиции (иерархические древовидные структурные диаграммы) и диаграммы «сущность – связь» для представления основных бизнес – процессов и структур данных, соответственно.
Таблица 12
Этапы подхода Мартина |
Используемые диаграммы |
|
|
|
|
1. |
Стратегия планирования |
Диаграммы декомпозиции |
|
|
|
2. |
Анализ бизнес-процессов |
Диаграммы «сущность – связь» |
|
|
Матрицы информационного пла- |
|
|
нирования |
|
|
Нормализованные модели данных |
3. |
Логическое проектирова- |
Диаграммы зависимости данных |
ние системы |
Диаграммы декомпозиции |
|
|
|
|
|
|
Матрицы «сущность–связь» |
4. |
Физическое проектиро- |
Диаграммы структуры данных |
вание и реализация |
Диаграммы декомпозиции |
|
|
|
|
|
|
Диаграммы деятельности |
|
|
Схемы экранов/отчетов |
2. На этапе анализа основные бизнес–процессы, разработанные на этапе 1, используются для разбиения общей задачи на частные, при этом основное внимание уделяется определению информационной и функциональной моделей для частных задач. При этом диаграммы «сущность–связь» трансформируется в нормализованную модель данных, а диаграммы декомпозиции распределяются по подзадачам. Для представления процессов служат DFD, диаграммы зависимости данных (диалект DFD) и диаграммы декомпозиции, а для соотнесенных данных и процессов, в которых эти данные используются, применяются матрицы «сущность-процесс».
123
3.На этапе логического проектирования IE становится аналогична SE для разработки ПО. Базой для проектирования являются процессы, разработанные на этапе анализа. Используя методики нисходящей функциональной декомпозиции, проектируются спецификации обработки в процессах и их логические структуры данных. При этом используются диаграммы структуры данных (диалект ERD), определяющие типы сущностей, их атрибуты и связи, диаграммы декомпозиции и диаграммы деятельности (вид миниспецификации), детализирующие логику процессов. Для согласования требований пользователя создаются прототипы пользовательских интерфейсов
спомощью схем экранов/отчетов.
4.На этапе физического проектирования и реализации производится преобразование логической модели ПС в физическую и ее реализация.
Ниже в табл. 13 [6] приведены частоты использования методологий при разработке ПС.
Таблица 13
Название |
Частота ис- |
Порядок по- |
Тип систем |
|
методологии |
пользования |
строения |
||
|
||||
|
|
|
ИС (информаци- |
|
|
|
Процедурно- |
онные системы), |
|
Йодан |
36.5% |
СРВ (системы |
||
ориентированный |
||||
|
|
реального време- |
||
|
|
|
||
|
|
|
ни) |
|
Гейн- |
20.2% |
Процедурно- |
ИС, СРВ |
|
Сарсон |
ориентированный |
|||
|
|
|||
Джексон |
7.7% |
Ориентация на |
ИС |
|
данные |
||||
|
|
|
||
Варнье-Орр |
5.8% |
Ориентация на |
ИС |
|
данные |
||||
|
|
|
||
Мартин |
22.1% |
Ориентация на |
ИС |
|
данные |
||||
|
|
|
||
SADT |
3.3% |
Процессы, дан- |
ИС |
|
ные |
||||
|
|
|
124
Контрольные вопросы
1.Что понимается под CASE?
2.Каковы преимущества CASE?
3.Каковы средства структурного системного анализа?
4.Какие техники используются в CASE?
5.Что представляют из себя DFD?
6.Что такое спецификация процесса?
7.Что записывается в словаре данных?
8.Для чего используются STD?
9.Что отражается в ERD?
10.Для чего составляются диаграммы атрибутов?
11.В чем заключается SADT?
12.Какие элементы используются в структурных картах?
6.ЭТАП КОДИРОВАНИЯ
6.1. Стиль программирования, эффективность программ
Под стилем программирования понимается набор приемов и методов, применяемых для получения правильных, эффективных, удобных и легко читаемых программ [1, 3, 8, 18].
При разработке программ должен использоваться так называемый «KISS» принцип (Keep It Simple, Stupid).
Использование изощренных приемов обходится очень дорого. Этап отладки и модификации изощренных программ потребует слишком много времени [18].
Для того, чтобы упростить программу, используют упрощение операторов и постоянство приемов проектирования, кодирования.
Для уменьшения сложности используются структурное проектирование и кодирование [8] – проектирование сверху
125
вниз, модульное программирование, структурное кодирование (использование только одного входа и одного выхода, неиспользование оператора безусловного перехода).
Существует теорема о структурировании [7, 8], доказательство которой туманно: «любую правильную программу можно написать с использованием только трех структур:
последовательность двух и более операторов; выбор одного из двух вариантов; повторение, пока выполняется условие.
В структурном проектировании задача сначала определяется в общих чертах, а затем происходит ее детализация. Основная цель делится на подцели в виде дерева.
Рис. 22. Дерево целей
При проектировании следует учитывать оптимальное использование ресурсов вычислительной системы, эффективно проводить отладку программ и компиляторов программ, контролировать вычислительный процесс, обеспечить надежность работы комплекса программ при различных возмущениях, обеспечить достоверность комплекса программ, возможность удобной модификации и корректировки.
При проектировании важно использовать новые технологии, в частности, автоматизировать работу проектировщика (универсальный язык моделирования).
По возможности следует математические модели алгоритма и других компонентов программы на всех стадиях ее разработки.
126
6.2. Комментарии
Один из приемов программирования - включение комментариев [3, 11] в программу. Комментарии не должны перефразировать программу, а должны давать дополнительную информацию, поясняющую смысл действий, выраженных операторами. Комментарии располагаются так, чтобы программа выглядела более наглядно. Комментарии бывают вводными, блоковыми и операторными.
Вводные комментарии располагаются перед текстом программы, функции, процедуры и включают в себя:
назначение программы; указание по вызову программы и ее использования;
cписок и назначение основных переменных и массивов; указания по обмену с внешними устройствами и файла-
ми;
список используемых процедур и функций; наименование применяемых математических методов,
ссылки на литературные источники, в которых содержится их описание;
сведения о времени выполнения программы; специальные указания операторам; требуемый объем памяти;
cведения об авторах, дата написания или последней версии программы.
Блоковые комментарии сопровождают отдельные модули и блоки программы. Операторный комментарий описывает назначение отдельного оператора (комментарий с минимальной информацией).
Пропуск строк используют для выделения логически связанных блоков программы. Для удобства и легкости чтения программы применяют отступы. Принято использовать не более 2-3 уровней вложенности, шаг отступа полагать равным 3-
127
5 позициям. Последний уровень не должен выходить за рамки экрана.
В арифметических выражениях перенос выполняется после знака операции, в списках - после разделителя.
Пробелы служат для выделения всех конструкций программы (ключевых слов, идентификаторов, отдельных операторов и т.д.).
Идентификаторы формируются по следующим прави-
лам:
осмысленность (имя напоминает соответствующую переменную в исходной программе);
включение максимальной информации о данном объек-
те;
исключение в аббревиатуре гласных из слова; использование префиксов или постфиксов.
Имена выбираются осмысленно так, чтобы они отражали постановку задачи. Существует так называемая «венгерская нотация» выбора идентификаторов: при выборе имен используются префиксы (предлоги). Префикс характеризует тип переменной.
«c» - тип char; «h» - тип shortint; «i» - тип integer;
«x», «y» - обозначение координат;
«b» - тип Boolean; «w» - тип word; «l» - тип longint;
«dw» - тип double word; «fn» - function;
«s» - тип string;
«sz» - тип string, заканчивающийся символом конца строки «\0»;
«p» - тип указателя.
128
Следует избегать выбора подобных по написанию имен: AXIO (только буквы) и АХ10(буквы и цифры).
Если сокращают длину идентификатора, то пользуются принятыми стандартами на сокращение: каждое слово в имени подлежит сокращению, если общее количество слов более трех; в аббревиатуру всегда должны включаться начальные буквы слов (от 6 до 15); согласные важнее гласных; начало лова важнее его конца.
В одной строке обычно располагается 1 оператор. Принято упорядочивать списки: последовательность
элементов должна иметь определенную логику.
Правильно оформленная программа должна быть со-
ставлена с учетом следующих нормативов: |
|
||
размер модуля |
10-15 непустых строк, |
||
размер имен |
|
5-10 символов, |
|
комментарии |
|
15-25 % от размеров модуля, |
|
отступы |
|
24-48 %, |
|
пустые строки |
15-30 %, |
|
|
длина строки |
|
15-25 символов, |
|
пробелы в строке |
4-10, |
|
|
поименованные константы 15-25 %. |
|
||
Пример комментирования функции: |
|
||
{ Вычисление тестовой функции F=x*x*x/(1+x+x*x). |
} |
||
{ Параметры: |
x - аргумент функции. |
} |
|
{ Возвращаемые значения: F - вычисленная функция. |
} |
||
{ Используемые процедуры и функции: нет. |
} |
||
{ Пример расчета функции в точке 0.1: Fx01:=F(0.1); |
} |
||
{ Автор: Подрезов А.С., 12.05.98г. |
} |
||
Function F(x: Real) : Real; |
|
||
Begin |
|
|
|
F:= sqr(x)*x/(1+x+sqr(x)); |
|
||
end; |
|
|
|
129
6.3. Модульное программирование
Модульное программирование - это процесс разработки программ, реализующих логические части алгоритма всей задачи. Все модули [7] программируются независимо друг от друга, что позволяет правильно организовать процесс разработки всей системы.
Принципы модульного программирования:
каждый модуль не зависит от его контекстного использования;
модули формируются в большие программы без предварительных знаний о внутренней работе модулей.
Для обеспечения межмодульной независимости требу-
ются:
независимость модуля от источника входных данных; независимость модуля от места назначения выходных
данных; независимость модуля от предыстории;
локализация объектов внутри исполняемого модуля; определение для каждого модуля алгоритма решения
задачи, набора и области допустимых входных и выходных значений.
6.4. Структурное кодирование
Структурное кодирование - это метод написания хоро-
шо структурированной программы [7, 8], который позволяет получать программный продукт более удобный для тестирования, модификаций и использования.
После декомпозиции и определения множества модулей, формирующих проектируемую систему, начинается кодирование сверху вниз: в первую очередь кодируется модуль са-
130
мого верхнего уровня (главная программа). Это позволяет проводить тестирование параллельно с кодированием модулей.
Для тестирования сверху вниз в программу включаются "заглушки". "Заглушки" реализуются в виде фиктивных модулей и выполняют простую обработку данных до тех пор, пока не будет закодирован реальный модуль.
6.5. Защитное программирование
Это стиль написания программ [3], при котором выявленные ошибки легко обнаруживаются и идентифицируются программистом. Предполагается включение в программу средств исключения ошибок. Необходимо руководствоваться следующими принципами.
1). Общее недоверие. В каждом модуле входные данные подлежат проверке по типу, по области допустимых значений, по правдоподобности. Вводятся контроль итогов промежуточных вычислений, автоматические проверки переполнения, исчезновения порядка, существования файлов и т.д. Проверяются длины элементов информации (для символьных строк) на критические значения, контролируются обязательные элементы полей или записей данных, контрольные разряды (метод избыточного кодирования).
2). Немедленное обнаружение ошибок. Средства обна-
ружения ошибки по возможности размещаются ближе к источнику ошибки.
3). Изолирование ошибок. Исключается влияние волнового эффекта, когда возникновение ошибки в одной части программы распространяется на другие части. В этом помогает модульный метод, при котором данные внутрь модуля передаются только через интерфейс.
По возможности не следует применять принцип умолчания. Например, при наличии n условий в программе необхо-
131
димо предусмотреть n+1 проверок, из которых n - рабочие, а одна избыточная, направленная на выявление ошибки.
Рассмотрим пример [11] использования в Turbo Pascal функции val для проверки вводимой информации. Ниже представлен фрагмент программы для ввода с клавиатуры числа из
интервала [0,2]. |
|
... var str: string; |
{ строка вводимых символов } |
n: real; |
{ введенное число} |
сode: integer; |
{ код преобразования строки в число} |
.......... |
|
{ Повторение ввода до тех пор, пока не введено число из интервала [0; 2]}
repeat
writeln('Введите число из интервала [0,2]');
readln(str); |
{чтение символов с клавиатуры } |
val(str,n,code); |
{преобразование строки в число} |
until (code=0) and (n<=2) and (n>=0); ..........
6.6. Эффективность программ
Обычно программа разрабатывается сначала наилучшим образом, затем, если она будет многократно использоваться, то ставится вопрос об эффективности программы [3].
Участок программы, поглощающий до 90 % времени выполнения, называется критической областью [18]. Обычно объем этой области не превышает 5-10 % всего программного кода. Основная задача повышения эффективности программ - поиск критической области и ее оптимизация.
Основным способом поиска критической области является профилирование программ, т.е. оценка времени выполнения отдельных фрагментов программы.
Выделяют оптимизацию [7, 18] времени выполнения и ресурсов (памяти и т.п.).
132