Стандарти написання вихідного коду в 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;