Стандарти написання вихідного коду в Delphi

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

7. ОПЕРАТОРИ

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

Для спрощення процесів трасування та налагодження коду слід дотримуватись правил: "один оператор – один рядок".

Це простий оператор:A := B;

Це складовий або структурований оператор:begin B := C; A := B; end;

7.1. ПРОСТІ ОПЕРАТОРИ

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

MyValue := MyValue + (SomeVeryLongStatement / OtherLongStatement);

7.2. СКЛАДНІ ОПЕРАТОРИ

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

begin MyStatement; MyNext Statement; MyLastStatement; end;

7.3. ПРИСВОЄННЯ І ВИРАЗИ

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

Правильноa := b + c; Inc(Count);

Неправильноa := b + c; Inc(Count);

7.4. ОГОЛОШЕННЯ ЛОКАЛЬНИХ ЗМІННИХ

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

var MyData: Integer; MyString: string;

var x, y, z: integer;

При цьому змінні, різні за змістом, слід розміщувати в окремому рядку, навіть якщо вони мають однаковий тип:

var x, y :integer; left:integer;

7.5. ОГОЛОШЕННЯ МАСИВІВ

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

7.6. ОПЕРАТОР IF

Найімовірніший варіант виконання if/then/else слід розташовувати у реченні then , а найменш ймовірні варіанти – у реченні else .

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

Неправильноякщо 0 DoSomething;

Неправильноif (I > 0) then DoSomething;

7.7. ОПЕРАТОР 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;

7.8. ОПЕРАТОР WHILE

Неправильноwhile x 25;

7.10. ОПЕРАТОР CASE

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

Пропозицію else конструкції case слід використовувати тільки для "всіх інших варіантів" (за замовчуванням значень, виявлення помилок і т.д.). Якщо else використовується для заміни варіанта виконання, який може бути винесений у звичайний варіант вибору, це некоректно і конструкція повинна бути змінена таким чином, щоб замінити використання else звичайним варіантом вибору в 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;

7.11. ОПЕРАТОР TRY

Оператор try у блоці try..finally..end обов'язково має бути використаний за будь-якого виділення ресурсів для забезпечення гарантії їх звільнення.

ПравильноObject := TObject.Create; try Object.DoWork; finally Object.Free; end;

Якщо ресурси виділяються кілька разів поспіль, слід використовувати кілька вкладених подібних конструкцій. Не рекомендується об'єднувати кілька операцій з виділення ресурсів та їх звільнення в одній конструкції, оскільки це не гарантує звільнення виділених ресурсів у разі виникнення виключення до входу до блоку try..finally або всередині блоку finally..end .

ПравильноObject1 := TObject1.Create; try Object2 := TObject2.Create; try Object1.DoWork; Object2.DoWork; finally Object2.Free; end; finally Object1.Free; end;

НеправильноObject1 := TObject1.Create; Object2 := TObject2.Create; try Object1.DoWork; Object2.DoWork; finally Object1.Free; Object2.Free; end;

Приклад використання оператора try:

Правильноtry try EnumThreadWindows(CurrentThreadID, @Disable, 0); Result := TaskWindowList; except EnableTaskWindows(TaskWindowList); raise; end; finally TaskWindowList := SaveWindowList; TaskActiveWindow := SaveActiveWindow; end;