Формат исходного кода на Object Pascal

Материал из GedeminWiki

Перейти к: навигация, поиск

Ниже приводятся требования к формату исходного кода, написанного на языке Object Pascal.

  • Зарезервированные слова (begin, end, while etc.) набираются строчными буквами.
  • Следующие символы и последовательности символов выделяются пробелами с двух сторон: + - * / := = < > <> >= <= Пример:
Value := A + 5 / 6;
  • Следующие символы выделяются пробелом справа: : ; , Пример:
Variable: Integer;
...
A := B + C; D := E * F;
MyFunc(A, B);
  • Следующие символы не выделяются пробелами: ( ) [] {} . ‘ # ^ (. .) (* *) $ .. Пример:
MyFunc(A, B);
A: array[1..100] of Integer;
T := P^;
I := $77;
  • Не рекомендуется набирать операторы if...then...else в одну строку. В случае использования вложенных структур if…then…else обязательно использование операторных скобок begin, end.
  • Стандартный отступ — 2 пробела.
  • Отступами выделяются:
    • Оператор после зарезервированных слов then, else, do, repeat.
if A > B then
  Result := A
else
  Result := B;
	
while A < 100 do
  Inc(A);
  • Составной оператор, причем сами операторные скобки begin, end отступами не выделяются;
if A > B then
begin
 B := A;
 Result := A;
end;
  • Объявление констант после зарезервированного слова const.
const
  MyConst = 777;
  • Объявление переменных после зарезервированного слова var.
var
  MyVar: Integer;
  • Объявление типов после зарезервированного слова type.
type
  MyType = 1..2;
  • Перечисление подключаемых модулей после зарезервированного слова uses.
uses
  FirstUnit, SecondUnit, ThirdUnit;
  • Вложенные (локальные) функции и процедуры относительно внешней функции или процедуры.
function MyFunc: Integer;
	  
  function LocalFunc: Integer;
  begin
    Result := 5;
  end;

  begin
    Result := LocalFunc;
  end;
  • При объявлении класса, секции следуют в следующем порядке: private, protected, public, published. Если секция пустая, т.е. не содержит объявлений методов, переменных или properties, то она не указывается в объявлении класса. Начало каждой секции (кроме первой) выделяется пустой строкой. В пределах одной секции объявления переменных, методов и properties отделяются друг от друга пустыми строками. Кроме этого пустые строки используются для выделения логических групп (конструктор и деструктор отделяются от других методов; переменные, хранящие значения properties отделяются от других переменных и т.п.). Реализация методов класса происходит в обратном порядке, т.е. сначала public методы, затем protected и private, причем в пределах одной секции реализация методов происходит в порядке их объявления. Пример:
{ declaration }
	
type
  TMyClass = class
  private
    FVariable: Integer;

    function GetVariable: Integer;
    procedure SetVariable(AVariable: Integer);
	
    procedure DoIt;
	
  public
    constructor Create;

    property Variable: Integer read GetVariable write SetVariable;
  end;	

{ implementation }

  constructor TMyClass.Create;
  begin
    inherited Create;
    FVariable := 555;
  end;

  function TMyClass.GetVariable: Integer;
  begin
    Result := FVariable;
  end;

  procedure TMyClass.SetVariable(Avariable: Integer);
  begin
    FVariable := AVariable;
  end;

  procedure TMyClass.DoIt;
  begin
    { do something with variable }
  end;
  • При переносе длинной строки вторая, третья и все последующие части набираются с отступом относительно первой, причем операторы оставляются в конце предидущей строки:
 VeryLongIdentifier := FirstVariable /
   SecondVariable *
   (ThirdVariable + FourthVariable);
  • Комментарии должны быть написаны грамотным английским или русским языком.
  • Всегда использовать константы вместо непосредственных значений.
  • Составной оператор должен умещаться на один экран, т.е. быть не длиннее чем в 20-25 строк кода.
  • При работе с компонентом Notebook рекомендуется обращаться к страницам либо по именам, либо определить константы для обращения по индексам.
  • закрывающий end должен находиться на одном уровне с открывающим begin.

Пример отформатированного кода

 procedure _Ok;
 begin
   // перед проверкой надо убрать курсор с эдита
   // чтобы изменения занеслись в поле
   if ModalResult = mrCancel then
     SetFocusedControl(btnCancel)
   else
     SetFocusedControl(btnOk);

   if TestCorrect then
   begin
     if DlgModified then
     begin
       Post;
       ModalResult := MrOk;
     end else
     begin
       Cancel;
       ModalResult := MrCancel;
     end;
   end else
   begin
     ModalResult := mrNone;

     if sSubDialog in gdcObject.BaseState then
     begin
       MessageBox(Handle,
         'Возможно, поле, которое необходимо заполнить находится'#13#10 +
         'в нижележащем диалоговом окне. В этом случае, закройте текущее окно'#13#10 +
         'с помощью кнопки Отмена и введите корректную информацию.',
         'Внимание',
         MB_OK or MB_ICONINFORMATION);
     end;
   end;
 end;

См. также

Личные инструменты