Стандарты написания исходного кода в Delphi. ОПЕРАТОРЫ

7. ОПЕРАТОРЫ

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

Для упрощения процессов трассировки и отладки кода следует придерживаться правила: "один оператор – одна строка".

Это простой оператор:
  A := B;

Это составной или структурированный оператор:
  begin
    B := C;
    A := B;
  end;

7.1. ПРОСТЫЕ ОПЕРАТОРЫ

Простые операторы содержат одну точку с запятой. Если Вам необходимо разделить операторы, то перенесите продолжение оператора на следующую строку с отступом в два пробела:

  MyValue :=
    MyValue + (SomeVeryLongStatement / OtherLongStatement);

7.2. СОСТАВНЫЕ ОПЕРАТОРЫ

Составные операторы всегда заканчиваются точкой с запятой.

  begin
    MyStatement;
    MyNext Statement;
    MyLastStatement;
  end;

7.3. ПРИСВОЕНИЯ И ВЫРАЖЕНИЯ

Каждое присвоение и каждое выражение должно располагаться на разных строках.

Правильно
  a := b + c;
  Inc(Count);

Неправильно
  a := b + c; Inc(Count);

7.4. ОБЪЯВЛЕНИЕ ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ

Локальные переменные должны иметь стиль Camel Caps. Для локальных переменных префикс F не требуется.

  var
    MyData: Integer;
    MyString: string;

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

  var
    x, y, z: integer;

При этом переменные, различные по смыслу следует размещать в отдельной строке, даже если они имеют одинаковый тип:

  var
    x, y :integer;
    left :integer;

7.5. ОБЪЯВЛЕНИЕ МАССИВОВ

В объявлении массива перед и после квадратных скобок должны стоять пробелы.

  type
    TMyArray = array [0..100] of Char;

7.6. ОПЕРАТОР IF

Наиболее вероятный вариант исполнения 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;

7.7. ОПЕРАТОР FOR

Неправильно
  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;

7.8. ОПЕРАТОР WHILE

Неправильно
  while x < j do begin
    DoSomething;
    DoSomethingElse;
  end;

Правильно
  while x < j do
  begin
    DoSomething;
    DoSomethingElse;
  end;
  while x < j do
    Something;

7.9. ОПЕРАТОР REPEAT UNTIL

Правильно
  repeat
    x := j;
    j := UpdateValue;
  until j > 25;

7.10. ОПЕРАТОР CASE

Отдельные варианты в операторе 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;

7.11. ОПЕРАТОР TRY

Оператор 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