Обеспечение надежности и повышение качества программ
Моделирование является лишь одним аспектом обеспечения надёжности программных комплексов и имеет цель – прогнозирование числа ошибок, остающихся в системе, на основе использования статической информации о процессе обнаружения и устранения ошибок. Не менее важное значение имеют две другие области обеспечения надёжности программных средств, безошибочное проектирование и испытания, ориентированные на обеспечение надёжности.
Вероятно, самым лучшим способом получить надёжное программное обеспечение является сведение к минимуму числа ошибок и их последствий
в ходе разработки комплекса программ. Однако не существует какого-либо проверенного способа создания надёжного программного обеспечения. Отсутствует пока и какая-либо теоретическая основа методики разработки безошибочных программ. Тем не менее, по общему мнению, существует целый ряд методов разработки программ и управления этим процессом, которые позволяют создавать надёжные программы. К этим методам, обычно, относится структурное программирование и некоторые, связанные с ним приёмы.
Идея структурного (модульного) программирования базируется на стремлении упорядочить сложные комплексы программ и их проектирование. Строгое определение термина «структурное программирование» не существует. Имеется несколько определений структурного (модульного) программирования. Чаще всего оно определяется как программирование без использования операторов GO TO, с применением нисходящего метода разработки программ и с использованием принципа модульного конструирования программ. Указанные три приёма повышают надёжность, удобочитаемость и удобство обслуживания программного обеспечения.
Программирование без использования операторов GO TO. Сам по себе оператор безусловного перехода не приводит к ошибкам. Однако передача управления с помощью этого оператора может вызвать усложнение логической схемы программы и сделать её трудночитаемой. Наоборот, исключение операторов GO TO позволяет получить более понятную и удобочитаемую программу. Кроме того, программу, не содержащую операторов безусловного перехода, легче проверить.
Нисходящее программирование. По существу, имеется два способа составления программ: снизу вверх и сверху вниз. Классическим способом составления большинства программ является движение снизу вверх. При таком подходе руководитель группы программистов рассматривает проект в целом, формулирует цели системы, а затем определяет элементы, необходимые для системы программного обеспечения. Задаются средства сопряжения, и отдельные части программы распределяются между программистами. Каждый программист отвечает за проверку своей подсистемы или модуля до момента объединения последних в единую систему. Интеграция модулей в систему выполняется последовательно по уровням и поручается самому квалифицированному из авторов стыкуемых программ. Такой подход к составлению программ аналогичен способу разработки аппаратного оборудования.
Более надёжные программные комплексы позволяет получить «нисходящее» программирование. В этом случае руководитель группы программистов не только осуществляет контроль над работой, но и участвует в составлении программ.
Модульное конструирование программ. Обычно при составлении сложной программы её разбивают на отдельные модули так, что каждый из них может использоваться во многих других. Но при этом увеличивается вероятность возникновения всякого рода недоразумений и ошибок. Этот источник ошибок можно свести к минимуму, если вход в каждый модуль будет осуществляться только в его начало (сверху), а выход только в его конец (снизу).
Структурирование данных. Неотъемлемой компонентой комплексов программ являются данные, которые поступают на обработку, преобразуются, хранятся и выдаются внешним абонентам. Структурирование данных способствует уменьшению сложности комплекса программ и снижает вероятность появления ошибок из-за неправильного использования. В ряде систем сложность массивов данных превышает логическую сложность программ и обуславливает основную массу ошибок, выявляемых в процессе отладки. Поэтому большое значение при проектировании программ имеет строгое описание переменных и простота структурного построения массивов.
Всю совокупность данных можно разделить на два иерархических уровня: простые переменные и массивы. Простые переменные представляют собой минимальную компоненту данных, имеющую имя и описание. Массивы образуются из нескольких простых переменных по некоторым правилам объединения и упорядочивания и имеют собственное описание, структуру и имя. Основными символами для описания данных являются буквы, цифры и ограничители. Наиболее часто используются следующие типы переменных:
- вещественные, принимающие действительные положительные и отрицательные значения в заданных пределах;
- целые, в заданных интервалах принимающие только целые положительные и отрицательные численные значения;
- булевы, принимающие только два значения: да или нет (истина или ложь);
- двоичные, представляющие собой последовательность бит;
- символьные, образующиеся из последовательности байтовых кодов, каждый из которых соответствует некоторому символу языка программирования или описания данных.
Из простых переменных по заданным правилам упорядочения образуются массивы, размеры которых задаются списками граничных пар. Структура массивов и правила упорядочения переменных различны и определяются следующими факторами:
- типами и структурой простых переменных, а также областью значений, которые могут принимать переменные;
- мощностью массива – наибольшим числом значений, которые могут принимать переменные, а также объемом памяти, необходимым для хранения массива в любой момент времени;
- способом заполнения и уплотнения переменных в памяти, используемой для хранения массива;
- методом и частотой заполнения и выборочного обновления компонентов массива и затратами производительности ЭВМ, необходимыми для обращения к массиву;
- типом реальной памяти, используемой для хранения массива.
Для повышения надёжности комплексов программ целесообразно использовать простейшие структуры массивов. При работе с массивами наибольшие затраты производительности ЭВМ связаны с поиском простых переменных или частных массивов, признаки которых удовлетворяют некоторому условию.