Содержание

Главная страница

Соглашения по исходному коду

Именование файлов

В именах юнитов с исходным кодом приняты следующие префиксы:

Связи между юнитами

Все остальные юниты могут зависеть друг от друга, но крайне желательно, что бы в разделе интерфейса были в основном i_ Юниты и t_ Юниты. Циклические ссылки между юнитами теоретически возможны, но их нужно максимально избегать.

Допустимые типы переменных в API плагинов

Форматирование кода

Длина строки.

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

Блоки Uses

Название каждого юнита с новой строки (опять же для упрощения диффов) примерно в таком порядке:

Идентификаторы

В именах типов, классов, методов, переменных, параметров и тд. Нужно использовать 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 По возможности в интерфейсах нужно избегать использования указателей. Использовать их стоит только если это действительно оправдано.