Определения данных
Понимая особую важность данных, приведем несколько правил их определения и использования [4].
Объявляйте все переменные явно. Во многих языках программирования разрешается определять данные неявно, просто используя их имена в выполняемых операторах. Такие «сокращения» предназначены для дилетантов или тех, кто программирует от случая к случаю, но не для программистов-профессионалов. Профессиональный программист должен явно определять или объявлять все переменные в самом начале модуля.
Объявляйте все атрибуты каждой переменной. Не следует также пользоваться имеющимися в языке сокращениями для объявления aтpибyтoв, не указанных явно, по умолчанию. Процесс выбора атрибутов по умолчанию часто сложен и ведет к ошибкам, если программист не вполне его понимает. Более того, некоторые компиляторы позволяют на каждой вычислительной установке изменять правила умолчания, что является крайне опасной практикой.
Избегайте явных констант. В исполняемом тексте программы не должно быть абсолютных констант, за исключением таких общеупотребительных значений, как единица, нуль, число ПИ и т.п. Для констант надо вводить символические имена и использовать их в программе
а=sin(0,7);
следует заменить на фрагмент программы:
с=0,7;
а=sin(c);
Никогда не используйте несколько имен для одной области памяти.
Никогда не используйте переменную более чем для одной цели. Распространенный прием экономии лишнего слова памяти состоит в повторном использовании переменной в различных целях. Программист вполне может решить: «Я закончил работать с TIME для расчетов времени, поэтому теперь буду использовать эту переменную как промежуточную при вычислении даты». Такая практика увеличивает шансы внесения ошибок при модификации программы.
Никогда не используйте особые значения переменной с особым смыслом. В определении параметров подпрограмм часто можно увидеть комментарии вроде такого: «ДЛСТРОКИ – это число символов во входной строке, причем ДЛСТРОКИ=0 означает ошибку при вводе». Это неоднозначное употребление параметра часто приводит к двусмысленным ситуациям и иногда затрудняет изменение программы. Чтобы передавать код ошибки, следует определить отдельный параметр.
Пишите модули, управляемые таблицами. При программировании модулей, реализующих сложный процесс принятия решений, эти решения следует описывать таблицей, а не встраивать в текст программы. Это сокращает и «обобщает» программу, а также значительно облегчает модификации.
Будьте осторожны с двоичной машиной. Двоичные машины обладают тем свойством, что числа с плавающей точкой в них представляются приближенными значениями. В такой машине умножение 10.0 на 0.1 редко дает в результате 1.0. Программист должен остерегаться этого свойства, особенно при попытке сравнивать два числа с плавающей точкой.
Будьте осторожны с действиями над целыми. Следует быть внимательным при умножении или делении целых чисел. Если I – целочисленная переменная, то ответ на вопрос, равны ли между собой I и 2*I/2, зависит от того, четно I или нет и что в сгенерированной компилятором программе будет выполняться раньше: умножение или деление.
Избегайте операций со значениями смешанных типов. Программисту не следует употреблять вперемешку переменные различных типов (например, двоичные, десятичные, плавающие) или различной точности в одном выражении; компилятор может выполнить некоторые неожиданные преобразования. Такие операции, как сложение строки символов с целочисленной переменной, нельзя делать никогда. Необходима осторожность при употреблении констант, поскольку компилятор может приписать им по умолчанию атрибуты, требующие неожиданных преобразований данных. Например, следующий фрагмент на Delphi:
WinExec( '"bin\tpc.exe" ' + ListBox.Items.Strings[2]);
{запуск консольного приложения с параметром, который написан во второй строчке листбокса}
Компилятор выдает ошибку на несовместимые типы String и PAnsiChar.
Для исправления этой ошибки строку нужно привести к PChar:
WinExec(PChar('"bin\tpc.exe" ' +ListBox.Items.Strings[2])).