Лекция №15.1: Технология программирования и отладки

страницы: 1 2 3

Методы и правила надёжного программирования. Создание, документирование, тестирование и отладка программ.

Содержание

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

Советы по технологии написания быстро отлаживаемых программ

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

Для того чтобы не приходилось «менять коней на переправе», необходимо уже в самом начале:

  • правильно оценить эффективность выбранного алгоритма (например, если в процессе работы будет производиться постоянная перестройка структуры, хранящей данные, то лучше остановить выбор на списочном алгоритме);
  • убедиться в том, что он корректно обрабатывает весь спектр входных данных (например, алгоритм Дейкстры нельзя применять, если в графе есть рёбра с отрицательным весом);
  • оценить вероятные трудозатраты на его создание (например, гораздо легче написать простую, а не улучшенную сортировку, и если объем входных данных позволяет, именно так и следует поступить) и т. п.

Если же на этапе выбора алгоритма всё–таки была допущена ошибка, то программу придётся писать заново. При этом некоторые блоки старого варианта (например, ввод/вывод1) могут не зависеть от выбора алгоритма, тогда переписывать их не нужно. Но основной алгоритм всё–таки необходимо исправить.

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

Далее мы перечислим общеизвестные правила, которые помогут вам минимизировать затраты времени и сил при написании программы.

Несмотря на то, что некоторые из этих правил могут показаться вам ненужными и занудными, следование им в процессе создания сложной программы очень облегчает и, главное, ускоряет её отладку. В общем, если перефразировать известное выражение, «овчинка стоит выделки».

Имена, имена, имена...

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

Совет 1. Создание любой программы (по выбранному алгоритму решения) начинайте с описания переменных. Разумеется, невозможно сразу же предусмотреть все переменные, которые могут потребоваться в ходе написания программы, однако самые важные — те, ради которых вся работа и затевается, — должны быть описаны с самого начала.

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

Совет 2. Старайтесь давать основным переменным говорящие имена. Ясно, что безликие rez1 и rez2 несут в себе гораздо меньше информации, чем, скажем, dlina и shirina. Однако не стоит заводить очень длинные — более 6-7 символов — имена, поскольку это, во–первых, затормозит написание программы, а во–вторых, повысит вероятность возникновения «очепяток». Стоит использовать сокращения, короткие синонимы, русские слова (русские по смыслу и прочтению, однако латинские по написанию).

Следите за тем, чтобы имена переменных заметно отличались друг от друга. Имена, которые различаются только одним символом, следует считать крайне неудачными. Однако во всём нужно знать меру и, разумеется, шесть вспомогательных переменных, отражающие шесть последовательных состояний одного и того же процесса, стоит назвать а1, а2, ... а6. Тем самым вы подчеркнёте их единую сущность.

При выборе имен переменных стоит также пользоваться интуитивно знакомыми вам условностями. Например, i и j обычно служат вспомогательными счётчиками, m и n чаще всего хранят размерность, а x и y — координаты. Лучше не отступать от привычных вам сокращений и обозначений, даже если они и не являются общепринятыми.

Совет 3. Имена функциям и процедурам также нужно давать говорящие, причём здесь ограничения на длину гораздо мягче: до 10-15 символов. Вряд ли ваша программа будет обращаться к процедурам и функциям столь же часто, как к переменным, поэтому здесь на первый план выходит наполнение имён подпрограмм объяснением выполняемых ею операций. Лучше не полениться и набрать два–три раза, например schet_min_zatrat, чем путаться во время отладки между schet_z и schet_p. Удобнее всего, если имена подпрограмм соответствуют выполняемым ими шагам алгоритма той или иной степени детализации: в этом случае легче выявить ошибки процесса кодирования и разработки (неправильный порядок операций, преждевременная остановка и т. п.).

Совет 4. Не вводите лишних переменных. Раздел описания должен содержать в себе только те переменные, которые затем будут встречаться в тексте программы. Это требование вызвано соображениями экономии, причём не столько места в памяти, сколько ваших усилий по вылавливанию непонятных ошибок.

Если в процессе написания программы вы решите отказаться от некоторой переменной, поймёте, что она лишняя — обязательно удалите её не только из текста программы, но и из раздела описаний. Этим вы застрахуетесь от непреднамеренного её использования где–нибудь, откуда из–за невнимательности вы забыли её выкинуть. Если вы уже выбросили «убиваемую» переменную из раздела описаний, но случайно оставили её в паре мест в тексте программы — не беда: первая же компиляция исправленной программы найдёт эти неописанные переменные.

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

Совет 5. Всегда проверяйте, верно ли вы указали способ подстановки аргументов в параметры подпрограммы (см. лекцию 8). Особенно важно не забывать об этом правиле, если вы создаёте рекурсивную подпрограмму, где одна переменная (параметр–переменная) должна возвращать самой себе какое–то значение, а другая переменная (параметр–значение), наоборот, при возвращении выполнения в данный экземпляр подпрограммы должна восстанавливать то значение, какое она имела до рекурсивного вызова.

Совет 6. Всегда отслеживайте области действия локальных переменных. Лучше всего, если в разных подпрограммах, пользующихся одними и теми же данными, параметры будут называться по–разному. Это избавит вас от такой трудно вылавливаемой ошибки, как изменение значения переменной там, где предполагается, что оно останется неизменным (так называемый «побочный эффект»). Особенно много подводных камней таится в бесконтрольном использовании одинаковых счётчиков в телах вызывающих друг друга процедур или функций. Синтаксис подобное использование разрешает, поэтому компилятор не распознает ошибку и не просигнализирует о ней. Стоит безобидной переменной–счётчику оказаться глобальной, и вам будет очень сложно понять, отчего же это она ведёт себя самым загадочным образом, меняя своё значение совсем не так, как предписывает ей заголовок цикла.

страницы: 1 2 3

Примечания

  1. ^ Впрочем, довольно часто при выборе нового алгоритма формат внутреннего представления данных меняется кардинально, так что переделывать блок ввода всё равно придётся.
Код для вставки: :: :: :: ::
Поделиться: // //