Операторы - это одна или более строк кода, разделенных точкой с запятой. Простые операторы имеют одну точку с запятой, а составные могут иметь более чем одну точку с запятой и, таким образом, состоят из множества простых операторов.
Для упрощения процессов трассировки и отладки кода следует придерживаться правила: "один оператор – одна строка".
Это простой оператор:
A := B;
Это составной или структурированный оператор:
begin
B := C;
A := B;
end;
Простые операторы содержат одну точку с запятой. Если Вам необходимо разделить операторы, то перенесите продолжение оператора на следующую строку с отступом в два пробела:
MyValue :=
MyValue + (SomeVeryLongStatement / OtherLongStatement);
Составные операторы всегда заканчиваются точкой с запятой.
begin
MyStatement;
MyNext Statement;
MyLastStatement;
end;
Каждое присвоение и каждое выражение должно располагаться на разных строках.
Правильно
a := b + c;
Inc(Count);
Неправильно
a := b + c; Inc(Count);
Локальные переменные должны иметь стиль Camel Caps. Для локальных переменных префикс F не требуется.
var
MyData: Integer;
MyString: string;
Все переменные с их типами, особенно поля класса, должны быть объявлены на различных строках. Допускается объявление локальных переменных методов, процедур и функций одного типа в одной строке, если они связаны с собой по смыслу:
var
x, y, z: integer;
При этом переменные, различные по смыслу следует размещать в отдельной строке, даже если они имеют одинаковый тип:
var
x, y :integer;
left :integer;
В объявлении массива перед и после квадратных скобок должны стоять пробелы.
type
TMyArray = array [0..100] of Char;
Наиболее вероятный вариант исполнения if/then/else следует располагать в предложении then, а наименее вероятные варианты – в предложении else.
Оператор if всегда должен располагаться, по крайней мере, на двух строках.
Неправильно
if A < B then DoSomething;
Правильно
if A < B then
DoSomething;
В случае составного оператора необходимо поместить каждый оператор на новую строку.
Неправильно
if A < B then begin
DoSomething;
DoSomethingElse;
end else begin
DoThis;
DoThat;
end;
Правильно
if A < B then
begin
DoSomething;
DoSomethingElse;
end
else
begin
DoThis;
DoThat;
end;
Последний приведенный вариант использования оператора if рекомендуется применять также и с несоставными операторами в сложных языковых конструкциях. Подобный подход, называемый "защищенное программирование" позволяет изначально заложить механизмы защиты от трудноуловимых ошибок в код при его последующих модификациях.
Все остальные варианты расположения операторов не рекомендуются и не одобряются, хотя и являются синтаксически правильными.
Избегайте использования круглых скобок в простых проверках. Например:
Правильно
if I > 0 then
DoSomething;
Неправильно
if (I > 0) then
DoSomething;
Неправильно
for i := 0 to 10 do begin
DoSomething;
DoSomethingElse;
end;
Правильно
for i := 0 to 10 do
begin
DoSomething;
DoSomethingElse;
end;
for I := 0 to 10 do
DoSomething;
Неправильно
while x < j do begin
DoSomething;
DoSomethingElse;
end;
Правильно
while x < j do
begin
DoSomething;
DoSomethingElse;
end;
while x < j do
Something;
Правильно
repeat
x := j;
j := UpdateValue;
until j > 25;
Отдельные варианты в операторе case следует упорядочивать либо по числам, либо по алфавиту. Если это имеет значение для понимания логики приложения, допускается упорядочивание отдельных вариантов оператора case в логическом порядке согласно функциональному расположению операторов в тексте кода.
Предложение else конструкции case следует использовать только для "всех прочих вариантов" (значений по умолчанию, обнаружения ошибок и т.д.). Если else используется для замены варианта исполнения, который может быть вынесен в обычный вариант выбора, то это некорректно и конструкция должна быть изменена таким образом, чтобы заменить использование else обычным вариантом выбора в case.
Несмотря на то, что существует множество синтаксически правильных конструкций, рекомендованной считается следующая:
Правильно
case ScrollCode of
SB_LINEUP, SB_LINEDOWN:
begin
Incr := FIncrement div FLineDiv;
FinalIncr := FIncrement mod FLineDiv;
Count := FLineDiv;
end;
SB_PAGEUP, SB_PAGEDOWN:
begin
Incr := FPageIncrement;
FinalIncr := Incr mod FPageDiv;
Incr := Incr div FPageDiv;
Count := FPageDiv;
end;
else
Count := 0;
Incr := 0;
FinalIncr := 0;
end;
Оператор try в блоке try..finally..end обязательно должен быть использован при любом выделении ресурсов для обеспечения гарантии их освобождения.
Правильно
Object := TObject.Create;
try
Object.DoWork;
finally
Object.Free;
end;
Если ресурсы выделяются несколько раз подряд, то следует использовать несколько вложенных подобных конструкций. Не рекомендуется объединять несколько операций по выделению ресурсов и их освобождению в одной конструкции, поскольку это не гарантирует освобождение выделенных ресурсов в случае возникновения исключения до входа в блок try..finally или внутри блока finally..end.
Правильно
Object1 := TObject1.Create;
try
Object2 := TObject2.Create;
try
Object1.DoWork;
Object2.DoWork;
finally
Object2.Free;
end;
finally
Object1.Free;
end;
Не правильно
Object1 := TObject1.Create;
Object2 := TObject2.Create;
try
Object1.DoWork;
Object2.DoWork;
finally
Object1.Free;
Object2.Free;
end;
Пример использования оператора try:
Правильно
try
try
EnumThreadWindows(CurrentThreadID, @Disable, 0);
Result := TaskWindowList;
except
EnableTaskWindows(TaskWindowList);
raise;
end;
finally
TaskWindowList := SaveWindowList;
TaskActiveWindow := SaveActiveWindow;
end;
Copyright © 2004 Вячеслав Колдовский Специально для Delphi Plus