Пишите правильно…

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

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

Повышаем надежность
Абсолютно надежных программ не существует в природе. От ошибок не застрахован никто, в том числе и производители операционных систем. Задача программиста заключается в том, чтобы уменьшить число этих ошибок и дать программе возможность корректно продолжать работу даже после их возникновения.
Совет 1. Добивайтесь, чтобы ваш код компилировался без предупреждений (Warning) и советов (Hint) со стороны Delphi — даже если программа работает и с ними. Разработчики Borland не зря едят свой хлеб — анализатор кода Delphi дает очень точные замечания. Не пренебрегайте ими!
Совет 2. Все константные выражения объявляйте в секции const. Впоследствии это поможет централизованно изменять их значения, что снижает риск того, что вы забудете изменить такую константу в каком-нибудь выражении.
Совет 3. Включите в опциях компилятора проверку ошибок Range Check и Integer Overflow Check (по умолчанию эти опции отключены). Появление этих сообщений говорит о наличии в программе “семантических” ошибок. Как правило, это несоответствие типов или неверная индексация массива. Эти ошибки могут проявить себя через длительное время, поэтому лучше исправить их сразу.
Совет 4. При написании программы постарайтесь учесть все возможные варианты ее неправильного использования. Например, попытку запуска в системе, где недостаточно ресурсов (памяти) или нет какого-либо оборудования (например, звуковой карты). “Защитите” все опасные фрагменты кода конструкциями try | except — это поможет предотвратить “падение” системы. Исходите из того, что пользователь может нажать любую кнопку в любом месте, а не будет делать только то, что вы предусмотрели.
Совет 5. Для всех используемых переменных необходимо предусмотреть “нулевое” значение. Для указателей лучше использовать nil, для числовых типов — ноль, для строк — пустую строку, а для перечисляемых типов специальное значение none.
Совет 6. Всегда инициализируйте переменные каким-либо начальным значением.
Совет 7. При передаче параметров в процедуры и функции используйте ссылки, то есть ключевые слова var и const. Это позволяет значительно экономить ресурсы при частом вызове функции. Одна из самых типичных ошибок начинающих программистов:

procedure Proc(s: string); // Так делать нежелательно!
procedure Proc(const s: string); // А вот так уже лучше.

Совет 7. Ограничивайте циклы не строгим значением, а “обрезкой” интервала.
Это лишь несколько советов, позволяющих повысить надежность разрабатываемых приложений. Но следование им поможет вам (и пользователям ваших программ) избежать кучи проблем.

Повышаем скорость
Как известно, компилятор Delphi умеет оптимизировать код. То есть при генерации ассемблерного кода он старается сделать этот код как можно короче (а значит, быстрее). Но идеальных программ, как я уже говорил, не бывает. Следовательно, и оптимизация далеко не безгрешна. Но, следуя нескольким простым советам, можно помочь компилятору, увеличив тем самым скорость работы вашей программы.
Совет 1. Не используйте переменные для временного хранения констант. Подставляйте в расчетные выражения сами константы или их значения.
Совет 2. Не присваивайте переменные через “посредника”. Например так:

x:=25;
b:=x;
ShowMessage(IntToStr(b));
Лучше напишите сразу:
ShowMessage(IntToStr(x));

Совет 3. При описании математических выражений старайтесь их упростить — Delphi не умеет этого делать. Например, выражение (3*a-a)/2 однозначно равно a, но Delphi будет честно его высчитывать!
Совет 4. Не используйте конструкции типа a:=10*sin(45*pi/180). Лучше посчитайте это значение сами, иначе Delphi будет каждый раз считать (!) и значение числа pi, и синус. На крайний случай замените хотя бы pi на 3.1415…
Совет 5. Не задавайте в операторе if заведомо невыполнимых условий или условий, “перекрывающих” друг друга. Например: (a>0) and (a<15616) and (a<>0).
Совет 6. Если в условии несколько раз проверяется одно и то же выражение, следите, чтобы оно было выражено во всех конструкциях одинаково. В противном случае скомпилированный код будет неоптимален. Например, if ((a*b)>0) and ((a*b)<1024) then… При перестановке во втором случае b*a смысл выражения не изменится, но код будет иметь уже не одну операцию умножения, а две. Можно присвоить проверяемое выражение временной переменной (c:=a*b), а затем уже проверять полученное значение.
Совет 7. Избегайте сообщений “Combining signed and unsigned types — widened both operands”. При присвоении переменных разных типов Delphi преобразует их к старшему типу, что отнимает ресурсы!
Совет 8. При делении на степень двойки, если не важно округление до большего, рекомендуется пользоваться (shr 1) вместо (div 2).
Совет 9. В конструкции case | of по возможности используйте элементы, расположенные в арифметической прогрессии.
Совет 10. Не используйте математические выражения в качестве границ цикла! Например:

for i:=0 to Length(str) do…

При работе с таким циклом значение Length(str) будет высчитываться для каждой итерации цикла! Необходимо записывать так:

Len:=Length(str);
for i:=0 to Len do…

Это одна из самых распространенных ошибок новичков.

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


Рекомендуем почитать: