Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Правила программирования

Читайте также:
  1. A. Различаем правила и стратегии.
  2. AT СТАЦИОНАРНАЯ И AT ОПЕРАТИВНАЯ. ПОЗЫ AT. ПРАВИЛА ВЫПОЛНЕНИЯ AT
  3. III. ПРАВИЛА ВЫПОЛНЕНИЯ ПРЫЖКОВ С ПАРАШЮТОМ.
  4. LI. Правила действий воздушного судна-перехватчика и воздушного судна-нарушителя
  5. V. ПРАВИЛА ПРОВЕДЕНИЯ СОРЕВНОВАНИЯ
  6. VI. Общие требования и правила полетов
  7. VI. ПРАВИЛА ПРИЗЕМЛЕНИЯ. МЕРЫ ПО ПРЕДУПРЕЖДЕНИЮ ТРАВМАТИЗМА.

С приобретением опыта программист вырабатывает собственные правила и стиль. При этом совершенно не обязательно наступать на все грабли самому. Разумное следование приведенным ниже рекомендациям поможет избежать многих распространенных ошибок. Конечно, на все случаи жизни советы дать невозможно, ведь не зря многие считают программирование искусством.

Главная цель, к которой нужно стремиться, — получить легко читаемую программу возможно более простой структуры. В конечном счете все технологии программирования направлены на достижение именно этой цели, поскольку только так можно добиться надежности программы и легкости ее модификации.

  1. Программа должна состоять из максимально обособленных частей, связанных друг с другом только через интерфейсы. Следует четко отделять интерфейс подпрограммы или модуля от их реализации и ограничивать доступ к информации, ненужной для их использования.
  2. Каждое закопченное действие оформляется в виде подпрограммы. Размер подпрограммы может быть разным, это зависит от конкретного действия, но желательно, чтобы ее тело помещалось на один-два экрана: одинаково сложно разбираться в программе, содержащей несколько необъятных функций, и в россыпи из сотен подпрограмм по нескольку строк каждая. Если какая-либо последовательность операторов используется хотя бы дважды, ее также нужно оформить в виде подпрограммы.
  3. Все величины, которыми подпрограмма обменивается с вызывающей программой, должны передаваться ей через параметры. Входные параметры предпочтительнее передавать как константы. Обычно в списке параметров сначала записывают все входные параметры, а затем — все выходные. Если подпрограмма возвращает одно значение, лучше оформить ее в виде функции, если несколько — в виде процедуры.
  4. В подпрограмме полезно предусматривать реакцию на неверные входные параметры и аварийное завершение. Это может быть или печать сообщения, или, что более предпочтительно, формирование признака результата. Этот признак необходимо анализировать в вызывающей программе. Сообщение об ошибке должно быть информативным и подсказывать пользователю, как ее исправить. Например, при вводе неверного значения в сообщении должен быть указан допустимый диапазон.
  5. Величины, используемые только в подпрограмме, следует описывать внутри нее как локальные переменные. Это упрощает отладку программы. Использовать глобальные переменные в подпрограммах нежелательно, потому что их изменение трудно отследить.
  6. Имена переменных должны отражать их смысл. Правильно выбранные имена могут сделать программу в некоторой степени самодокументированной. Неудачные имена, наоборот, служат источником проблем. Сокращения ухудшают читаемость, и часто можно забыть, как именно было сокращено то или иное слово. Общая тенденция состоит в том, что чем больше область видимости переменной, тем более длинное у нее имя. Перед таким именем можно поставить префикс типа (одну или несколько букв, по которым можно определить тип переменной). Для счетчиков коротких циклов, напротив, лучше обойтись однобуквенными именами типа i или k.
  7. Следует избегать использования в программе чисел в явном виде. Константы должны иметь осмысленные имена, заданные в разделе описания const. Символическое имя делает программу более понятной, а, кроме того, при необходимости изменить значение константы потребуется изменить программу только в одном месте. Конечно, этот совет не относится к константам 0 и 1.
  8. Для записи каждого фрагмента алгоритма необходимо использовать наиболее подходящие средства языка. Например, ветвление на насколько направлений по значению целой переменной более красиво записывается с помощью оператора case, а не нескольких if. Для просмотра массива лучше пользоваться циклом for. Оператор goto применяют весьма редко, например для принудительного выхода из нескольких вложенных циклов, а в большинстве других ситуаций лучше использовать другие средства языка, такие как процедуры break или exit.
  9. Программа должна быть «прозрачна». Если какое-либо действие можно запрограммировать разными способами, то предпочтение должно отдаваться не наиболее компактному и даже не наиболее эффективному, а такому, который легче для понимания. Особенно это важно тогда, когда пишут программу одни, а сопровождают другие, что является широко распространенной практикой. «Непрозрачное» программирование может повлечь огромные затраты на поиск ошибок при отладке.
  10. Не следует размещать в одной строке много операторов. Как и в русском языке, после знаков препинания должны использоваться пробелы:

f=a+b; { плохо! Лучше f = а + b; }

  1. Вложенные блоки должны иметь отступ в 3-4 символа, причем блоки одного уровня вложенности должны быть выровнены по вертикали. Форматируйте текст по столбцам везде, где это возможно:

var р: pnode; { удаляемый узел }

parent: pnode; { предок удаляемого узла }

y: pnode; { узел, заменяющий удаляемый }

...

if pA.left = nil then y:= pA.right

else if pA.right = nil then y:= p*.left

else у:= descent(p);

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

  1. Помечайте конец длинного составного оператора, например:

while true do begin

while not eof(f) do begin

for i:= 1 to 10 do begin

for j:= 1 to 10 do begin

{ две страницы кода }

end { for j:= 1 to 10 }

end { for i:= 1 to 10 }

end { while not eof(f) }

end { while true }

  1. Для организации циклов пользуйтесь наиболее подходящим оператором. Цикл repeat применяется только в тех случаях, когда тело непременно потребуется выполнить хотя бы один раз, например при проверке ввода. Цикл for используется, если число повторений известно заранее и параметр имеет порядковый тип, цикл while — во всех остальных случаях. При записи итеративных циклов (в которых для проверки условия выхода используются соотношения переменных, формируемых в теле цикла) необходимо предусматривать аварийный выход по достижении заранее заданного максимального количества итераций. Чтобы цикл легче читался, надо стремиться объединять инициализацию, проверку условия выхода и приращение в одном месте.

Далее приведено несколько советов по записи операторов ветвления.

  1. Более короткую ветвь if лучше поместить сверху, иначе вся управляющая структура может не поместиться на экране, что затруднит отладку.
  2. Бессмысленно использовать проверку на равенство true или false:
    var busy: boolean;
    ...
    if busy = true then... { плохо! Лучше if busy then }
    if busy = false then... { плохо! Лучше if not busy then }
  3. Следует избегать лишних проверок условий. Например, вместо

if a < b then с:= 1

else if a > b then с:= 2

else if a = b then с:= 3;

можно написать

if a < b then с:= 1

else if a > b then с:= 2

else с:= 3;

или даже так:

с:= 3:

if a < b then с:= 1;

if a > b then с:= 2;

  1. Если первая ветвь оператора if содержит передачу управления, использовать else нет необходимости:

if i > 0 then exit;

{ здесь i <= 0 }

  1. Необходимо предусматривать печать сообщений в, тех точках программы, куда управление при нормальной работе программы передаваться не должно. Именно это сообщение вы с большой вероятностью получите при первом же запуске программы. Например, оператор case должен иметь слово else с обработкой ситуации по умолчанию, особенно если в нем перечислены все возможные значения переключателя.


Дата добавления: 2015-07-08; просмотров: 124 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Нисходящее тестирование| Документирование программы

mybiblioteka.su - 2015-2024 год. (0.007 сек.)