3. ИСПОЛЬЗОВАНИЕ ПРОБЕЛОВ И ОТСТУПОВ

3.1. ИСПОЛЬЗОВАНИЕ ПУСТЫХ СТРОК

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

3.2. ИСПОЛЬЗОВАНИЕ ПРОБЕЛОВ

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

3.3. ПРОБЕЛЫ, ЗАПРЕЩЕННЫЕ К ИСПОЛЬЗОВАНИЮ

Примеры правильного использования:

function TMyClass.MyFunc(var Value: Integer);
MyPointer := @MyRecord;
MyClass := TMyClass(MyPointer);
MyInteger := MyIntegerArray[5];

Примеры неправильного использования:

function TMyClass.MyFunc( var Value: Integer ) ;
MyPointer := @ MyRecord;
MyClass := TMyClass ( MyPointer ) ;
MyInteger := MyIntegerArray [ 5 ] ;

3.4. ИСПОЛЬЗОВАНИЕ ОТСТУПОВ

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

Существует несколько исключений из этого правила. Зарезервированные слова unit, uses, type, interface, implementation, initialization и finalization всегда должны примыкать к левой границе. Также должны быть отформатированы финальный end и end, завершающий исходный модуль. В файле проекта выравнивание по левой границе применяется к словам program, главным begin и end. Код внутри блока begin..end должен иметь стандартный отступ два символа.

3.5. ПЕРЕНОС СТРОК

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

Пример:

Правильно

function CreateWindowEx(dwExStyle: DWORD;
  lpClassName: PChar; lpWindowName: PChar;
  dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
  hWndParent: HWND; hMenu: HMENU; hInstance: HINST;
  lpParam: Pointer): HWND; stdcall;

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

Правильно

procedure Foo(Param1: Integer; Param2: Integer);

Неправильно

procedure Foo( Param :Integer; Param2:Integer );

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

Неправильно

while (LongExpression1 or LongExpression2) do begin
  // DoSomething
  // DoSomethingElse;
end;

Правильно

while (LongExpression1 or LongExpression2) do 
begin
  // DoSomething
  // DoSomethingElse;
end;
if (LongExpression1) 
  or (LongExpression2) 
  or (LongExpression3) then 

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


if (LongExpression1) 
  or (LongExpression2) 
  or (LongExpression3) then 

В сложных конструкциях рекомендуется выравнивать скобки на одном уровне:


if   ((LongExpression11)
  and (LongExpression12))
  or ((LongExpression21)
   or (LongExpression22)) then

Либо "раскрывать скобки" подобным образом:


if (
          (LongExpression11)
      and (LongExpression12)
    )
  or 
    (
         (LongExpression21)
      or (LongExpression22)
    ) then

3.6. ЛОКАЛЬНЫЕ ПРОЦЕДУРЫ

Локальные функции и процедуры должны иметь стандартный отступ в два пробела вправо от их владельца и сама процедура должна выделяться пустыми строками по одной перед и после локальной процедуры.

Если "внешняя" процедура имеет локальные переменные, то они должны декларироваться в два этапа: вначале декларируются все переменные, доступные локальным процедурам – перед ними, далее перед телом "внешней" процедуры декларируются переменные, доступные только ей.

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


procedure SomeProcedure;
var
  I: Integer;

  procedure LocalProcedure1;
  begin
    ...
    I := I + 1;
    ...
  end;

  procedure LocalProcedure2;
  begin
    ...
  end;

var
  J: Integer;
begin
  ...
  LocalProcedure1;
  J := J + 3;
  I := I + 2;
  ...
  LocalProcedure2;
  ...
end;

СОДЕРЖАНИЕ

Copyright © 2004 Вячеслав Колдовский   Специально для Delphi Plus