
- •Алгоритмизация и основы программирования
- •Оглавление
- •Библиографический список
- •1. Критерии качества программы
- •1.1. Характеристики показателей
- •Показатели надежности
- •Показатели сопровождения
- •Показатели удобства применения
- •Показатели Эффективности
- •Показатели универсальности
- •Показатели корректности
- •1.2. Метрология программного продукта
- •1.3. Методы определения показателей качества (гост 28195-89)
- •2. Жизненный цикл программы
- •2.1. Каскадная модель жизненного цикла программы
- •2.2. Спиральная модель
- •3. Корректность программ
- •4. Тестирование и отладка программного средства (пс)
- •4.1. Принципы и виды отладки
- •4.2. Заповеди отладки
- •5. Структурное программирование
- •6. Правила хорошего стиля программирования
- •Контрольные вопросы
4.2. Заповеди отладки
В данном разделе даются общие рекомендации по организации отладки. Но сначала следует отметить некоторый феномен [10.1], который подтверждает важность предупреждения ошибок на предыдущих этапах разработки: по мере роста числа обнаруженных и исправленных ошибок в ПС растет также относительная вероятность существования в нем необнаруженных ошибок. Это объясняется тем, что при росте числа ошибок, обнаруженных в ПС, уточняется и наше представление об общем числе допущенных в нем ошибок, а значит, в какой-то мере, и о числе необнаруженных еще ошибок. Этот феномен подтверждает важность раннего обнаружения ошибок и необходимость тщательного контроля принимаемых решений на каждом этапе разработки ПС.
Требования к тестирующим функциям:
Прозрачность. Тестирующим функция должна выводить сообщения только в случае ошибок. При правильной работе программы тест не должен быть виден.
Автоматизм. Тест не должен требовать от программиста или пользователя никаких действий, типа ввод данных, визуальное сравнение результатов и т.д.
Всеобъемлемость. Тестироваться должны все крайние ситуации.
Иллюстративность. По тексту тестирующей функции программист должен определить, как пользоваться тестируемой функцией.
Ниже приводятся рекомендации по организации отладки в форме заповедей.
Считайте тестирование ключевой задачей разработки ПС, поручайте его самым квалифицированным и одаренным программистам; нежелательно тестировать свою собственную программу.
Хорош тот тест, для которого высока вероятность обнаружения ошибки, а не тот, который демонстрирует правильную работу программы.
Готовьте тесты, как для правильных, так и для неправильных данных.
Избегайте невоспроизводимых тестов, документируйте их пропуск через компьютер; детально изучайте результаты каждого теста.
Никогда не изменяйте программу, чтобы облегчить ее тестирование.
Пропускайте заново все тесты, связанные с проверкой работы какой-либо программы ПС или ее взаимодействия с другими программами, если в нее были внесены изменения (например, в результате устранения ошибки).
5. Структурное программирование
Впервые основные идеи структурного программирования были высказаны Эдсгером Дейкстрой в 1965 году и позже опубликованы в его работе [10]. Основная задача, которую Э. Дейкстра решал, разрабатывая идеи структурного программирования, была задача доказательства правильности программы. Его внимание было сосредоточено на вопросе, «какими должны быть структуры программ, чтобы без чрезмерных усилий мы могли находить доказательство их правильности».
При структурном программировании становится излишним вычерчивание блок-схем. Блок-схема вполне структурированной программы настолько тривиально проста, что о программе можно сказать больше по тексту, чем по блок-схеме.
Структуризованная программа – это программа, составленная из фиксированного базового множества первичных программ.
Первичная программа – это простая программа, не имеющая простых подпрограмм, состоящих более чем из одного узла.
Простая программа – это программа, которая:
имеет один вход и один выход
для каждого узла существует путь от входа до выхода, проходящий через этот узел
Теоретической основой структурного программирования принято считать принципы, изложенные в классической работе Бома и Джакопини [4]. Эта работа в оригинале на итальянском языке была опубликована в 1965 г., а в английском переводе – в 1966 г.
В соответствии с так называемой «структурной» теоремой, сформулированной и доказанной в этой работе, всякая программа может быть построена с использованием только трех основных типов блоков [4].
Функциональный блок. Ему в языках программирования соответствуют операторы ввода и вывода или любой оператор (группа операторов) присваивания. В виде функционального блока может быть изображена любая последовательность операторов, выполняющихся один за другим, имеющая один вход и один выход.
Рис.4. Функциональный блок
Условная конструкция. Этот блок включает проверку некоторого логического условия (P), в зависимости от которого выполняется либо оператор S1, либо оператор S2: If P Then S1 Else S2;
Рис.5. Условная конструкция
Блок обобщенного цикла. Этот блок обеспечивает многократное повторение выполнения оператора(ов) S, пока выполнено логическое условие P. Аналог блока обобщенного цикла на языке Pascal: While P Do S;
Рис.6. Циклическая конструкция
Важной особенностью всех перечисленных блоков является то, что каждый из них имеет один вход и один выход.
Кроме того, блоки S, S1, S2, входящие в состав условной конструкции или блока обобщенного цикла, сами могут быть одним из рассмотренных типов блоков, поэтому возможны конструкции, содержащие "вложенные" блоки. Однако какова бы ни была степень и глубина "вложенности", важно, что любая конструкция в конечном итоге имеет один вход и один выход. Следовательно, любой сложный блок можно рассматривать как "черный ящик" с одним входом и одним выходом.
При конструировании программы с использованием рассмотренных типов блоков, эти блоки образуют линейную цепочку так, что выход одного блока подсоединяется к входу следующего. Таким образом, программа имеет линейную структуру, причем порядок следования блоков соответствует порядку, в котором они выполняются. Такая структура значительно облегчает чтение и понимание программы, а также упрощает доказательство ее правильности. Так как линейная цепочка блоков может быть сведена к одному блоку, то любая программа может в конечном итоге рассматриваться как единый функциональный блок с одним входом и одним выходом.