В именах юнитов с исходным кодом приняты следующие префиксы:
Все остальные юниты могут зависеть друг от друга, но крайне желательно, что бы в разделе интерфейса были в основном i_ Юниты и t_ Юниты. Циклические ссылки между юнитами теоретически возможны, но их нужно максимально избегать.
Мы предпочитаем делать строки короткими и наглядными. Короткие строки не только более читабельны, но и позволяют задавать операторы в более простой форме (особенно, когда они используются с описательными именами переменных). Методы, состоящие из серий коротких простых операторов, легче для восприятия и модифицирования. Даже диффы в результате точнее показывают, что поменялось между коммитами.
Название каждого юнита с новой строки (опять же для упрощения диффов) примерно в таком порядке:
В именах типов, классов, методов, переменных, параметров и тд. Нужно использовать CamelCase.
Сразу за именем переменной должно стоять двоеточие, потом пробел, потом имя типа.
Пример:
VOperationID: Integer;
Желательно использовать префиксы:
Объявление полей класса только по одному на строку с указанием типа для каждого.
Объявление локальных переменных - в большинстве случаев по одному на строку типа для каждой переменной отдельно (исключение простые счетчики)
Объявление параметров функций и процедур - по возможности указывать тип для каждой переменной отдельно, если параметров больше чем один-два, то каждый параметр должен расположен на отдельной строке.
Пример кода:
function FindItems( const AVisualConverter: ILocalCoordConverter; const ALocalPoint: TPoint ): IVectorItemSubset; constructor Create( const ARootFolderName: WideString; const AFolderNameFromRoot: WideString; const AFileMask: WideString; const AFilesOnly: Boolean );
Необходимо соблюдать отступы.
Пробелы перед запятой или точкой с запятой недопустимы.
После запятой должен быть пробел.
Операторные скобки begin/end обязательны.
begin располагается на той же строчке, что и операция к которой он относится.
end располагается на новой строчке с тем же отступом, что и команда к которой он относится
Пример кода:
if FDataRecived then begin VDataRecived := True; FDataRecived := False; end else begin if FLastDataReceiveTick > 0 then begin if FLastDataReceiveTick > VCurrTick then begin FLastDataReceiveTick := VCurrTick; end else begin VTickDelta := VCurrTick - FLastDataReceiveTick; if VTickDelta > VNotDataTimeout then begin FGPSRecorder.AddEmptyPoint; FGpsTrackRecorder.AddEmptyPoint; VDataRecived := True; end; end; end; end;
Закомментированный код зло и должен быть удален до коммита.
Весь функционал максимально прячется за интерфейсами. Это дает такие преимущества:
В интерфейсах нельзя использовать делфовских классов. То есть, если нам нужно возвратить или получить просто бинарные данные, то нужно использовать не TStream, а интерфейс IBinaryData (Сейчас есть пару исключений самое главное TCustomBitmap32, но это временно). Это же касается делфовских динамических массивов, объявленных как array of По возможности в интерфейсах нужно избегать использования указателей. Использовать их стоит только если это действительно оправдано.