Стандарт стилевого оформления исходного кода DELPHI
Страница 9. Дополнения



Дополнения

В этой части собраны дополнения, которые не вошли в стандарт Borland. Эти дополнения взяты из правил JCL и опыта российских разработчиков.

Const, Var и Type

Зарезервированные слова var, const и type всегда пишутся на новой строке и не допускают появления на этой же строке какого-либо текста.

Правильно

type
TMyType = Integer;

const
MyConstant = 100;

var
MyVar: Integer;

Неправильно

type TMyType = Integer;

const MyConstant = 100;

var MyVar: Integer;

Процедуры должны иметь только по одной секции type, const и var в следующем порядке:

procedure SomeProcedure;
type
TMyType = Integer;
const
ArraySize = 100;
var
MyArray: array [1..ArraySize] of TMyType;
begin
...
end; 

Директивы условной компиляции

Все директивы условной компиляции должны быть собраны в одном модуле ХХX.INC. Этот файл предназначен для определения глобальных директив. Оператор include должен быть помещен между ключевыми словами unit и interface. Никто не может мождифицировать файл ХХX.INC по собственному желанию.

Строковые ресурсы

Все строковые ресурсы должны иметь вид "Rs"[Category][Name]. [Category] должно быть аббревиатурой или названием категории кода, где используется строка. [Name] должно быть именем строки ресурса. Например, конструктор TJclCriticalSectionEx.CreateEx вызывает исключительную ситуацию при ошибке инициализации. Сообщение об ошибке объявляется в глобальном модуле ХХXResources.pas с именем RsynchInitCriticalSection.

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

Исключения

Все исключения должны начинаться с префикса EХХХ. Все исключения должны быть отнаследованны от класса ENхError. При возбуждении исключительной ситуации предпочтительным является ее создание с помощью метода CreateRes:

raise EХХХSomeException.CreateRes(@RsSomeResourceString);

Категории и разделение алгоритмов

Обычно, содержимое каждого созданного модуля есть набор классов, функций и процедур, принадлежащих к одной категории. Например, ХХХLogin содержит все, что относится к идентификации и персонификации пользователя. Для ясного восприятия исходного кода следует придерживаться следующего правила: в интерфейсной части модуля каждая группа функций, относящихся к одной субкатегории должны отделяться от другой группы функций тремя строками шириной 80 столбцов с описанием субкатегории на второй строке:

1
2Информация о последней попытке идентификации
3
procedure GetLastUserName(var ZUser: string);
procedure GetLastDatabase(var ZDatabase: string);

В секции реализации каждая подкатегория или класс должен разделяться строкой, состоящей из символов равенства (=), закомментированных однострочным комментарием и пустой строкой перед и после группы функций:

//=================================================

procedure GetLastUserName(var ZUser: string);
begin
...
end;
procedure GetLastDatabase(var ZDatabase: string);
begin
...
end;

//==================================================

Каждая функция из одной группы или методы класса должны разделяться между собой строкой, состоящей из символов минуса (-), закомментированных однострочным комментарием и пустой строкой перед и после функции или метода:

//==================================================

procedure GetLastUserName(var ZUser: string);
begin
...
end;

//--------------------------------------------------

procedure GetLastDatabase(var ZDatabase: string);
begin
...
end;

//==================================================

Ассемблер

Локальные процедуры

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

procedure SomeProcedure;
var
I: Integer;

procedure LocalProcedure;
begin
...
end;

begin
...
LocalProcedure;
...
end;

Объявление параметров

Когда объявляется список параметров для процедуры, функции или метода пользуйтесь следующими рекомендациями:
  • Комбинируйте формальные параметры одного типа в одно выражение;
  • Не используйте префикс А, кроме случаев, когда вызывается метод класса, который работает со свойством, которе имеет идентичное имя;
  • Придерживайтесь следующего порядка в параметрах: сначала входные параметры, затем входные/выходные, затем выходные. Параметры, имеющие значение по умолчанию по правилам Object Pascal помещаются в конец списка;
  • Используйте const для параметров, которые не изменяются при работе вызываемых методов, процедур или функций.

Инициализация глобальных переменных

Глобальные переменные, как и члены класса всегда инициализируются нулем. Это трудно для понимания в случае разных типов. Например Integer инициализируется в 0, а pointer в nil. Для этого рекомендуется указывать в комментарии как инициализируется переменная.

var
MyGlobalVariable: Pointer // = nil;

Несмотря на то, что глобальные переменные разрешены языком Object Pascal, используйте их лишь в самых крайних случаях.

 
 
« Предыдущая статья   Следующая статья »