Стандарт стильового оформлення вихідного коду DELPHI, Delphi, Програмування, статті

Автор: © Олександр В. Ткаченко






ВСТУП 


Цей стандарт документує стильове оформлення для форматування вихідного коду Delphi. Оригінал статті створено Чарльзом Калверт і розташований на “Borland Community site”. У стандарті використані матеріали команди розробників Delphi, спільноти розробників бібліотеки JEDI. Стандарт так само доповнено деякими правилами, створеними на основі власного досвіду розробки.


Object Pascal є чудово спроектованим мовою. Одним з його численних достоїнств є легка читабельність. Пропонований стандарт дозволить ще більше підвищити легкість читання коду Object Pascal. Дотримання досить простим угодами, наведеними в цьому стандарті, дозволить розробникам зрозуміти, що уніфіковане оформлення набагато підвищує читабельність і зрозумілість коду. Використання стандарту набагато полегшить життя під час етапів розробки і тестування, коли досить часто доводиться підміняти один одного і розбиратися в чужому коді.


Процес переходу з власного стилю оформлення на пропонований може виявитися непростим, але людський мозок досить легко адаптується до стандартів і знаходить шляхи для швидкого запам’ятовування пропонованих правил. Надалі, проходження стандарту не викликає труднощів. Для більш комфортабельного переходу на цей стандарт пропонується скористатися вільно поширюваної утилітою для форматування вихідних текстів “delforexp” (*).


Хочеться відзначити, що в компанії Borland, на Web-сайті компанії Borland, на CD, куплених у компанії Borland, скрізь де є вихідний код, стандарт форматування є законом.


Цей документ не є спробою визначити граматику мови Object Pascal. Наприклад, якщо Ви спробуєте поставити крапку з комою перед вираженням else, то компілятор не дозволить Вам цього зробити. Цей документ говорить Вам, як потрібно поступати, коли є можливість вибору з багатьох варіантів при оформленні Вашого вихідного коду.







ФАЙЛИ ВИХІДНОГО КОДА 


Вихідний код Object Pascal підрозділяється на модулі і файли проекту, які підпорядковуються однаковим угодами. Файл проекту Delphi має розширення DPR. Цей файл є головним вихідним файлом для всього проекту. Будь-які модулі, використовувані в проекті, завжди будуть мати розширення PAS. Додаткові файли, використовувані в проекті (командні, html, DLL і т.д.) можуть відігравати важливу роль, але ця глава описує форматування тільки PAS і DPR файлів.


Іменування вихідних файлів


Мова Object Pascal підтримує довгі імена файлів. Якщо при створенні імені Ви використовуєте кілька слів, то необхідно використовувати велику літеру для кожного слова в імені: MyLongName.pas. Цей стиль оформлення відомий як InfixCaps або CamelCaps. Розширення файлів повинні бути в нижньому регістрі. Історично, деякі вихідні файли Delphi іменуються за шаблоном 8.3, але в даний час розробники не зобов’язані дотримуватися цього обмеження.


Якщо Ви здійснюєте переказ заголовків файлів C / C + +, то паскалевской еквівалент повинен мати теж саме ім’я і розширення PAS. Наприклад Windows.pas. Якщо правила граматики мови Object Pascal вимагають об’єднання кількох транслювати файли в один, то використовуйте ім’я того файла, в який Ви вкладаєте інші. Наприклад: якщо WinBase.h вкладається в Windows.h, то результуюче ім’я буде Windows.pas.


Всі файли модулів, створені в організації ХХХ повинні мати префікс ХХХ

Організація вихідних файлів


Всі модулі Object Pascal можуть містити такі елементи в певному порядку:


Для візуального розділення елементів між ними повинна бути хоча б один порожній рядок.

Додаткові елементи можуть бути структуровані у порядку, що Ви вважаєте за потрібне, але треба дотримуватися обов’язкові умови: на початку файлу завжди копірайт, потім ім’я модуля, потім умовні директиви та визначення, директиви компілятора і файли включення, потім визначення підключень.










{************************************************************}
{ } {Модуль ХХХ} {Copyright (c) 2001 ТОВ ХХХХ} {Відділ / сектор}
{ } {Розробник: ХХ ХХ} {Модифікований: 25 червня 2001}
{ }
{************************************************************}
unit Buttons;


Директиви компілятора не слід безпосередньо включати в вихідний код. Для цього слід скористатися визначенням включень і підключити глобальний для проекту файл з директивами компілятора:










{$I NX.INC}
interface


У разі необхідності, можна напряму перевизначити глобальні директиви компілятора. Слід пам’ятати, що перевизначають директиви повинні бути задокументовані і Ви повинні постаратися обмежитися тільки локальним перевизначенням. Наприклад для однієї процедури:










{$S-,W-,R-}
{$C PRELOAD}
interface
uses
Windows, Messages, Classes, Controls, Forms, Graphics, StdCtrls,
ExtCtrls, CommCtrl;


Секції визначення типів і констант Ви можете розташовувати відносно один одного як Вам завгодно. Секція реалізації повинна починатися з ключового слова implementation, потім оголошення використовуваних модулів (Uses clause), потім будь-які включення файлів або інші директиви.










implementation
uses
Consts, SysUtils, ActnList, ImgList;
{$R BUTTONS.RES}


Копірайт і коментар


Приклад заголовка для модуля:










{************************************************************}
{ } {Модуль ХХХ} {Copyright (c) 2001 ТОВ ХХХХ} {Відділ / сектор}
{ } {Розробник: ХХ ХХ} {Модифікований: 25 червня 2001}
{ }
{************************************************************}


Слід звернути увагу на елементи заголовка:


Оголошення модуля


Кожен вихідний файл повинен містити оголошення модуля. Слово unit є ключовим, тому воно повинно бути написано в нижньому регістрі. Ім’я модуля може містити символи як у верхньому, так і в нижньому регістрі і має бути таким же, як і ім’я використовується для цього файлу операційною системою. Наприклад:

unit MyUnit;

Цей модуль буде названий MyUnit.pas, Коли він буде збережений операційною системою

Оголошення використовуваних модулів


Всередині модуля оголошення використовуваних модулів повинно починатися зі слова uses в нижньому регістрі. Потім слідують найменування модулів із збереженням регістра символів:

uses MyUnit;

Кожен використовуваний модуль повинен відокремлюватися від наступного за допомогою коми. Оголошення використовуваних модулів повинно закінчуватися крапкою з комою. Список використовуваних модулів необхідно розташовувати на наступному рядку після слова uses. Якщо використовуються модулі з різних проектів або виробників, то необхідно згрупувати модулі по проектам або виробникам і кожну нову групу починати з нової рядка і постачати коментарями:










uses
Windows, SysUtils, Classes, Graphics, Controls, Forms, TypInfo / / модулі Delphi , XХХMyUnit1, ХХXMyUnit2; / / модулі ХХХ


Якщо список використовуваних модулів не вміщується по ширині в 80 символів, то його необхідно перенести на наступний рядок.

Оголошення класів та інтерфейсів


Оголошення класу починається з двох прогалин, потім йде ідентифікатор класу з префіксом Т в нотації InfixCaps. Ні в якому разі у вихідних файлах Object Pascal можна використовувати табуляцію:

TMyClass

Слідом за ідентифікатором класу йде пробіл, знак рівності, пробіл і слово class в нижньому регістрі:

 TMyClass = class 

Якщо необхідно визначити батька класу, то слід додати відкриває дужку, ім’я класу-батька і закриває дужку:

  TMyClass = class(TObject)

Оголошення областей видимості починаються з двох прогалин і, отже, області видимості розташовуються на одному рівні з ідентифікатором класу:










  TMyClass = class(TObject)
private
protected
public
published
end;


Дані завжди повинні розташовуватися тільки в приватній секції і назви змінних повинні завжди починатися з префікса F. Всі оголошення усередині класу повинні починатися з чотирьох пробілів:










  TMyClass = class(TObject)
private
FMyData: Integer;
function GetData: Integer;
procedure SetData(Value: Integer);
public
published
property MyData: Integer read GetData write SetData;
end;


Оформлення оголошень інтерфейсів підпорядковується тим же правилам, що і оформлення класів. Відмінність буде у використанні ключових слів специфічних для інтерфейсів


 






УГОДА ПРО Іменування 


Виключаючи зарезервовані слова і директиви, які завжди пишуться у нижньому регістрі, все ідентифікатори Object Pascal повинні використовувати InfixCaps:

MyIdentifier MyFTPClass

Найголовніше виняток для всіх правил полягає у використанні оттранслірованном заголовних файлів С / С + +. В цьому випадку завжди використовуються угоди, прийняті в файлі джерелі. Наприклад буде використовуватися WM_LBUTTONDOWN, а не wm_LButtonDown.


Для поділу слів не можна використовувати символ підкреслення. Ім’я класу має бути іменником або фразою з іменником. Імена інтерфейсів або класів повинні відображати головну мету їх створення:


Правильно:

AddressForm
ArrayIndexOutOfBoundsException

Неправильно:

ManageLayout (дієслово)  delphi_is_new_to_me (підкресліть) 

Іменування модулів


Дивіться пункт 2.1.

Іменування класів та інтерфейсів


Дивись оголошення класів та інтерфейсів.

Іменування полів


При іменуванні полів завжди необхідно використовувати InfixCaps. Завжди оголошувати змінні тільки в приватних частинах і використовувати властивості для доступу до змінних. Для змінних використовувати префікс F.


Імена процедур для установки / отримання значень властивостей повинні складатися за правилом: для отримання – Get + ім’я властивості; для установки – Set + ім’я властивості.



Правильно

  FMyString: string;

Неправильно

  lpstrMyString: string;

Виняток для Угорської нотації робиться в разі оголошення перечислимого типу:

  TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp,
bkYes, bkNo, bkClose, bkAbort, bkRetry,
bkIgnore, bkAll); bk позначає ButtonKind

Коли Ви роздумуєте над іменами змінних, то майте на увазі, що потрібно уникати однобуквені імен, окрім як для тимчасових змінних і змінних циклу.


Змінні циклу іменуються I і J. Інші випадки використання однобуквені змінних це S (Рядок) і R (Результат). Однобуквені імена повинні завжди використовувати символ у верхньому регістрі, але краще використовувати більш значущі імена. Не рекомендується використовувати змінну l (Ель), тому що вона схожа на 1 (Одиниця).


Іменування методів


При іменуванні полів завжди необхідно використовувати стиль InfixCaps. Не допускається використання символів підкреслення для розділення слів. В імені методу завжди повинна міститися команда до дії або дієслівна фраза


Правильно:

ShowStatus
DrawCircle
AddLayoutComponent

Неправильно:

MouseButton (Іменник, не описує функцію)  drawCircle (Починається з маленької літери)  add_layout_component (Використовуються символи підкреслення)  ServerRunning (Дієслівна фраза, але без команди) 

Зверніть увагу на останній приклад (ServerRunning) – незрозуміло, що робить цей метод. Цей метод може використовуватися для запуску сервера (краще StartServer) або для перевірки роботи сервера (краще IsServerRunning).


Методи для установки або отримання значень властивостей повинні іменуватися Get + ім’я властивості і – Set + ім’я властивості.
Наприклад:

GetHeight, SetHeigh

Методи для тіста / перевірки булевских властивостей класу повинні іменуватися з префіксом Is + ім’я властивості.
Наприклад:

IsResizable, IsVisible

Іменування локальних змінних


Імена всіх локальних змінних повинні підкорятися тим же правилам, які встановлені для іменування полів, виключаючи префікс F.


Зарезервовані слова


Зарезервовані слова і директиви повинні бути все в нижньому регістрі. Похідні типи повинні починатися з великої літери (Integer), проте string – це зарезервоване слово і воно повинно бути в нижньому регістрі.


Оголошення типів


Всі оголошення типів повинні починатися з префікса Т і повинні дотримуватися правил, наведених при описі оформлення модуля або описі оформлення класу.


 






ВИКОРИСТАННЯ ПРОБІЛ 


Використання порожніх рядків


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



Використання прогалин


Мова Object Pascal є дуже легким для розуміння мовою, тому немає особливої ​​необхідності у використанні великої кількості пробілів. Наступні пункти дадуть Вам розуміння того, в якому випадку необхідно використовувати прогалини.


Прогалини, заборонені до використання



Приклади правильного використання:

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 ] ;

Використання відступів


Завжди необхідно використовувати два пропусків для всіх рівнів відступу. Іншими словами, перший рівень відступає на два пробілу, другий на чотири і так далі. Ніколи не використовуйте символи табуляції.


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


Перенесення рядків


Всі рядки повинні бути обмежені 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


 






КОМЕНТАРІ 


Мова Object Pascal підтримує два типи коментарів: блокові і однорядкові. Загальні міркування щодо використання коментарів можуть бути наступними:



Блокові коментарі


Object Pascal підтримує два типи блокових коментарів. Найбільш часто використовуваний блоковий коментар – це пара фігурних дужок: { }. Команда розробників Delphi воліє використовувати цей коментар як можна простіше і як запасний. Використовуйте в таких коментарях прогалини для форматування тексту і не використовуйте символи “зірочкою” (“*”). При перенесенні рядків необхідно зберігати відступи і вирівнювання


Приклад з DsgnIntf.pas:









{ TPropertyEditor
Edits a property of a component, or list of components,
selected into the Object Inspector. The property
editor is created based on the type of the
property being edited as determined by the types
registered by…
etc…
GetXxxValue
Gets the value of the first property in the
Properties property. Calls the appropriate
TProperty GetXxxValue method to retrieve the
value.
SetXxxValue Sets the value of all the properties
in the Properties property. Calls the appropriate
TProperty SetXxxxValue methods to set the value. }


В блоковий коментар завжди полягає інформація про модуль: копірайт, дата модифікації і так далі. Блоковий коментар, що описує метод повинен йти перед оголошенням методу.


Правильно









{ TMyObject.MyMethod
This routine allows you to execute code. }
procedure TMyObject.MyMethod;
begin
end;


Неправильно









procedure TMyObject.MyMethod;
{******************************************************
TMyObject.MyMethod
This routine allows you to execute code.
*******************************************************}
begin
end;


Другий тип блочного коментаря містить два символи: дужку і зірочку: (* *). Цей тип коментаря використовується при розробці початкового коду. Його перевагою є те, що він підтримує вкладені коментарі, правда коментарі повинні бути різного типу. Ви можете використовувати це властивість для коментування великих шматків коду, в якому зустрічаються інші коментарі:










(* procedure TForm1.Button1Click(Sender: TObject);
begin
DoThis; // Start the process
DoThat; // Continue iteration
{ We need a way to report errors here, perhaps using
a try finally block ??? }
CallMoreCode; // Finalize the process
end; *)


Однорядкові коментарі


Однорядковий коментар складається з символів / / з наступним за ними текстом коментаря. Після символів / / повинен йти пробіл і потім текст. Однорядкові коментарі повинні мати відступи такі ж, як і код, в якому вони зустрічаються. Однорядкові коментарі можна згрупувати, щоб сформувати великий коментар.


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


Приклад однорядкового строкового коментаря:









// Open the table
Table1.Open;


Приклад коментаря в коді:









if (not IsVisible) then
Exit; // nothing to do
Inc(StrLength); // reserve space for null terminator


Необхідно уникати використовувати коментарі в коді для кожного рядка модуля.
[До змісту]






КЛАСИ 


Структура тіла класу


Тіло класу при його декларації підпорядковане наступній структурі:


Поля, властивості та методи у вашому класі повинні бути впорядковані в алфавітному порядку.

Рівні доступу


Виключаючи код, вставлений IDE, директиви видимості повинні бути оголошені в наступному порядку:


Таким чином, в Object Pascal існує чотири рівні доступу для членів класу: published, public, protected і private – у порядку зменшення видимості. За замовчуванням, рівень доступу – published. Загалом, члени класу повинні давати найменший рівень доступу, який підходить для цього члена. Наприклад, член, до якого мають доступ класи з одного модуля повинен мати рівень доступу private. Крім того, оголошуючи члени класу з найменшим рівнем доступу, Ви дозволяєте компілятору скористатися додатковими можливостями для оптимізації. З іншого боку, якщо Ви плануєте надалі породжувати дочірні класи від Вашого класу, то потрібно використовувати рівень доступу protected.


Ніколи не вказуйте рівень доступу public для даних. Дані завжди повинні бути оголошені в приватній секції та доступ до них повинен здійснюватися за допомогою методів або властивостей.


Оголошення конструктора


Всі методи класу повинні бути впорядковані за алфавітом. Проте Ви можете помістити оголошення конструктора і деструктора перед усіма іншими методами. Якщо у класу існує більш ніж один конструктор і якщо вони мають однакові імена, то вони повинні розташовуватися в порядку збільшення числа параметрів

Оголошення методів


По можливості, оголошення методу повинно розташовуватися на одному рядку:
Наприклад:









procedure ImageUpdate(Image img, infoflags: Integer,
x: Integer, y: Integer, w: Integer, h: Integer)


 






ІНТЕРФЕЙСИ 


Всі основні правила форматування для класів застосовуються і для форматування інтерфейсів. Інтерфейси декларуються в тій же манері, що і класи.










InterfaceName = interface([Inherited Interface])
InterfaceBody
end;


Відступ для інтерфейсу повинен бути рівний двом прогалинам. Тіло інтерфейсу має відступ чотири пропуски. Закриваючий end повинен мати відступ в два пробілу. Оголошення класу закінчується крапкою з комою. У інтерфейсу не існує полів, однак властивості можуть бути присутніми.


Всі методи інтерфейсу є абстрактними і загальнодоступними, тому не потрібно включати слова public і abstract в оголошення методу.


Структура тіла інтерфейсу


Тіло інтерфейсу при його декларації підпорядковане наступній структурі:


Стилі для оголошення властивостей і методів інтерфейсу аналогічним стилям для класу.
 






ОПЕРАТОРИ 


Оператори – це одна чи більше рядків коду, розділених крапкою з комою. Прості оператори мають одну точку з комою, а складові можуть мати більш ніж одну точку з комою і, таким чином, складаються з безлічі простих операторів.


Це простий оператор:

A := B; 

Це складовою або структурований оператор:

begin
B := C;
A := B;
end;

Прості оператори


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

MyValue :=
MyValue + (SomeVeryLongStatement / OtherLongStatement);

Складові оператори


Складові оператори завжди закінчуються крапкою з комою.

begin
MyStatement;
MyNext Statement;
MyLastStatement;
end;

Присвоєння та вирази


Кожне привласнення і кожен вираз має розташовуватися на різних рядках.
Правильно

a := b + c;
Inc(Count);

Неправильно

a := b + c; Inc(Count);

Оголошення локальних змінних


Локальні змінні повинні мати стиль Camel Caps. Для локальних змінних префікс F не потрібно.

var
MyData: Integer;
MyString: string;

Всі змінні з їх типами, особливо поля класу, повинні бути оголошені на різних рядках.

Оголошення масивів


В оголошенні масиву перед і після квадратних дужок повинні стояти пропуски.

type
TMyArray = array [0..100] of Char;

Оператор if


Оператор if завжди повинен розташовуватися по крайней мере на двох рядках
Неправильно

if A < B then DoSomething; 

Правильно

if A < B then
DoSomething;

У разі складеного оператора необхідно помістити кожен оператор на новий рядок.


Неправильно









  if A < B then begin
DoSomething;
DoSomethingElse;
end else begin
DoThis;
DoThat;
end;


Правильно









  if A < B then
begin
DoSomething;
DoSomethingElse;
end
else
begin
DoThis;
DoThat;
end;


Всі інші варіанти розташування операторів не рекомендуються і не схвалюються, хоча і є синтаксично правильними. Уникайте використання круглих дужок в простих перевірках. Наприклад:


Правильно

  if I > 0 then
DoSomething;

Неправильно

  if (I > 0) then
DoSomething;

Оператор for


Неправильно









for i := 0 to 10 do begin
DoSomething;
DoSomethingElse;
end;


Правильно









  for i := 0 to 10 do
begin
DoSomething;
DoSomethingElse;
end;
for I := 0 to 10 do
DoSomething;


Оператор while


Неправильно









  while x < j  do begin
DoSomething;
DoSomethingElse;
end;


Правильно









  while x < j do
begin
DoSomething;
DoSomethingElse;
end;
while x < j do
Something;


Оператор repeat until


Правильно









  repeat
x := j;
j := UpdateValue;
until j > 25;


Оператор case


Незважаючи на те, що існує безліч синтаксично правильних конструкцій, схваленої та рекомендованої вважається наступна:


Правильно









 case ScrollCode of
SB_LINEUP, SB_LINEDOWN:
begin
Incr := FIncrement div FLineDiv;
FinalIncr := FIncrement mod FLineDiv;
Count := FLineDiv;
end;
SB_PAGEUP, SB_PAGEDOWN:
begin
Incr := FPageIncrement;
FinalIncr := Incr mod FPageDiv;
Incr := Incr div FPageDiv;
Count := FPageDiv;
end;
else
Count := 0;
Incr := 0;
FinalIncr := 0;
end;


Оператор try


Незважаючи на те, що існує безліч синтаксично правильних конструкцій, схваленої та рекомендованої вважається наступна:


Правильно









try
try
EnumThreadWindows(CurrentThreadID, @Disable, 0);
Result := TaskWindowList;
except
EnableTaskWindows(TaskWindowList);
raise;
end;
finally
TaskWindowList := SaveWindowList;
TaskActiveWindow := SaveActiveWindow;
end;


 






ДОПОВНЕННЯ 


У цій частині зібрані доповнення, які не увійшли в стандарт 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;


Оголошення параметрів


Коли оголошується список параметрів для процедури, функції або методу користуйтеся наступними рекомендаціями:


Ініціалізація глобальних змінних


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










var
MyGlobalVariable: Pointer // = nil;


Незважаючи на те, що глобальні змінні дозволені мовою Object Pascal, використовуйте їх лише в самих крайніх випадках.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*