Руководство по стилю Object Pascal — Чарльз Калверт
(Руководство по стилю кодирования Object Pascal — перевод: Томми Тонг)
Мы признаем, что многие известные студии или частные лица имеют свои собственные методы программирования, которые отличаются от описанных в этой статье, однако мы настоятельно рекомендуем вам использовать инструмент для преобразования вашего кода в код в стиле Borland, а затем отправить его в Borland. PRoject JEDI или любой другой общедоступный репозиторий исходного кода. Мы не хотим заставлять вас менять свои привычки, но настаиваем на том, чтобы весь код, работающий с продуктами Borland, соответствовал привычкам, описанным в этой статье.
Object Pascal — прекрасный язык дизайна. Хорошая читаемость является одним из его преимуществ. Стандарты, разработанные в этой статье, улучшат читаемость кода Object Pascal. Когда разработчики будут следовать этим простым привычкам, продемонстрированным в этой статье, они также станут стандартами, которые принесут пользу всем разработчикам Delphi, использующим единый и читаемый стиль кодирования. Усилия по обеспечению соблюдения этих стандартов повысят ценность исходного кода для разработчиков, особенно на этапах цикла обслуживания и отладки.
Хотя мы верим в стиль, предложенный в этой статье, и восхищаемся им, мы не обязательно одобряем его, потому что он верен сам по себе и неверен в других. Однако мы считаем, что стандарт, которому следует подавляющее большинство разработчиков, имеет силу, поэтому мы по-прежнему поддерживаем и поддерживаем этот стиль. Человеческий мозг всегда адаптируется к стандартам и находит способы быстро организовать знакомые закономерности, чтобы их значение можно было быстро и эффективно понять. Именно это требование устанавливает стандарты, которые сделают чтение кода максимально простым для большого количества людей. Если наши рекомендации кажутся вам впервые незнакомыми, мы просим вас придерживаться их некоторое время, и вы обнаружите, что привыкли к ним. Или, если хотите, вы можете сохранить свой собственный стиль и преобразовать его с помощью программы, соответствующей нашим стандартам, а затем отправить свой код в Borland или другие репозитории.
Некоторые текстовые редакторы, такие как Visual SlickEdit, могут помочь вам отформатировать код в определенном стиле.
Бесплатный форматтер, разработанный Эгбертом ван Несом, доступен по адресу:
http://www.slm.wau.nl/wkao/delforexp.html
Еще одна коммерческая программа для Delphi — CrackerJax:
http://www.kineticsoftware.com/html/products.html
-------------------------------------------------- ----
1.0 Введение
Эта статья не является попыткой определить правила синтаксиса для языка Object Pascal. Например: ставить печать ";" перед else запрещено; компилятор не допускает такого использования; Поэтому я не буду показывать грамматические правила в этой статье. Цель этой статьи – определить подходящее поведение, когда язык предоставляет выбор. Я обычно молчу там, где есть только один метод контроля.
1.1 Предыстория
Рекомендации, представленные в этой статье, основаны на части исходного кода Delphi. Исходный код Delphi точно соответствует этим рекомендациям. Если вы обнаружите нарушение этих принципов, то именно эти принципы, а не неопределенный исходный код, должны быть вашим ориентиром. Однако вы можете использовать исходный код как дополнение к этим принципам, хотя бы для того, чтобы получить общее представление о виде собственного кода.
1.2 Спасибо
Форматы в этой статье основаны на работе, проделанной для определения стандартов стиля для языка Java. Java не влияет на правила форматирования исходного кода Object Pascal, но основой для этой статьи является документация на веб-сайте Sun. В некоторых особых местах стиль и формат этой статьи во многом вдохновлены «Руководством по стилю кодирования для Java WorkShop и Java Studio Programming» (Ачут Редди, «Руководство по кодированию для Java WorkShop и Java Studio»). Статью можно найти по этому URL: http://www.sun.com/workshop/java/wp-coding.
Команда Delphi внесла значительный вклад в завершение этой статьи. Фактически, без их помощи эта статья не была бы завершена.
2.0 Исходные файлы
Исходный код Object Pascal в основном разделен на отдельные исходные файлы и файлы проектов, и все они следуют одному и тому же соглашению. Файлы проектов Delphi имеют расширение .DPR. Это основной файл проекта. Любой модульный файл, используемый в проекте, имеет расширение .PAS. Другие файлы, такие как пакетные файлы, файлы HTML или библиотеки DLL, также могут играть роль в проекте, но в этой статье рассматриваются только файлы проекта и файлы модулей.
2.1 Именование исходного файла
Object Pascal поддерживает длинные имена файлов. Если вы используете несколько слов для формирования одного имени, лучше всего использовать для каждого слова начальную заглавную букву: MyFile.pas. Это считается круглыми скобками или верблюжьим регистром. Расширения должны быть написаны строчными буквами. По историческим причинам исходный код Delphi часто использует шаблон именования 8:3, но разработчикам не нужно ограничиваться вышеуказанными правилами и обращаться к использованию команды Delphi.
Если вы переводите заголовочный файл C/C++, то переводимый файл Pascal должен иметь то же имя основного файла, что и заголовочный файл C/C++, и использовать .PAS в качестве расширения. Например: Windows.h -> Windows.pas. Если синтаксис Паскаля заставляет вас объединить несколько файлов заголовков в один файл модуля, то имя файла заголовка, который содержит другие файлы заголовков, будет использоваться в качестве имени нового файла модуля. Например: Windows.h содержит файл WinBase.h, тогда новый файл модуля будет называться Windows.pas.
2.2 Организация исходного файла
Все модульные файлы Object Pascal должны содержать следующие элементы в следующем порядке:
Комментарии к блокировке авторских прав/личных данных
название устройства
сегмент интерфейса
Реализация
Терминаторский «конец».
Между каждым разделом должна быть хотя бы одна пустая строка.
Другие элементы должны быть структурированы в том порядке, который вы считаете наиболее подходящим. Но авторские права должны быть указаны в самом начале файла, затем имя модуля, затем любые условные определения, директивы компилятора или операторы включения, а затем предложение использования:
{************************************************ * *****}
{ }
{ Библиотека визуальных компонентов Borland Delphi }
{ }
{ Авторское право (c) 1995,98 Inprise Corporation }
{ }
{************************************************ * *****}
блок Кнопки;
{$S-,W-,R-}
{$C ПРЕДВАРИТЕЛЬНАЯ ЗАГРУЗКА}
интерфейс
использует
Окна, Сообщения, Классы,
Элементы управления, формы, графика,
StdCtrls, ExtCtrls, CommCtrl;
Если вы поместите раздел type перед разделом const или смешаете их, это не даст никакого эффекта.
Часть реализации должна сначала написать реализацию, затем предложение использования, а затем другие объявления включения или другие индикаторы:
выполнение
использует
Константы, SysUtils, ActnList,
список изображений;
{$R BUTTONS.RES}
2.2.1 Комментарии к блоку авторских прав/личных данных
Каждый исходный файл должен начинаться с блочного комментария, содержащего информацию о версии и стандартное уведомление об авторских правах. Информация о версии может выглядеть следующим образом:
{************************************************ * *****}
{ }
{ Множество виджетов }
{ }
{ Авторские права (c) 1995,98 Ваша компания }
{ }
{************************************************ * *****}
Уведомление об авторских правах должно содержать как минимум следующие строки:
Авторские права (C) Год Владелец авторских прав
Если вы являетесь сторонней разработкой программного обеспечения для Borland, вы можете добавить свое имя в конце авторских прав:
{************************************************ * *****}
{ }
{ Библиотека визуальных компонентов Borland Delphi }
{ Авторское право (c) 1995,99 Borland International }
{ Создано Проектом ДжЕДАЙ }
{ }
{************************************************ * *****}
2.2.2 декларация единицы
Каждый файл модуля должен иметь объявление модуля. unit — зарезервированное слово, поэтому его нужно писать строчными буквами. Имя модуля может иметь смешанный регистр, но должно совпадать с именем файла модуля. Например:
модуль MyUnit;
Тогда имя файла модуля должно быть MyUnit.pas. В файловой системе он служит записью для этого файла.
2.2.3 использует оператор
Внутри модуля объявления об использовании должны быть дополнены меньшими использованиями. Имя указанной единицы соответствует соглашению о капитализации, используемому, когда оно определено в отдельной единице измерения:
используетМойЮнит;
Имя каждого модуля отделяется от имени соседнего модуля запятой, а за последним именем модуля следует точка с запятой:
использует
Windows, SysUtils, классы, графика, элементы управления, формы,
ТипИнформация;
Также правильно добавлять название юнита, начиная со следующей строки использования, и добавлять название юнита сразу после использования.
использует Windows, SysUtils, классы, графику, элементы управления, формы,
ТипИнформация;
Вы можете отформатировать список названий юнитов так, чтобы он ограничивался 80 символами, или чтобы на каждое имя юнита было по одной строке.
2.2.4 Определения классов и интерфейсов
Определения классов начинаются с двух пробелов, за которыми следует префикс «T». Префикс должен быть написан с заглавной буквы, а каждое встроенное слово должно начинаться с заглавной буквы. Не используйте символ табуляции «Tab» в исходном коде Object Pascal. пример:
ТМойКласс
После идентификатора следует пробел, затем знак равенства, затем слово class, которое должно быть написано строчными буквами:
ТМиКласс = класс
Если ваш класс наследуется от предка, вам нужно добавить левую и правую скобки, содержащие класс-предок:
TMyClass = класс (TObject)
Индикаторы диапазона располагаются через два пробела от поля и появляются в следующем порядке:
TMyClass = класс (TObject)
частный
защищать
общественный
опубликовано
конец;
Данные обычно объявляются только в приватном разделе, а их идентификаторы начинаются с «F». Все такие утверждения должны быть через 4 пробела от поля:
TMyClass = класс (TObject)
частный
FMyDate: целое число;
функция GetDate: целое число;
процедура SetData (Значение: целое число);
общественный
опубликовано
свойство MyData: целое число, чтение GetData, запись SetData;
конец ;
Интерфейсы следуют тем же правилам, что и их аналоги, за исключением того, что вы должны игнорировать индикаторы области и частные данные и использовать слово «интерфейс» вместо слова «класс».
соглашение об именах
За исключением зарезервированных слов и индикаторов, которые написаны строчными буквами, все идентификаторы Pascal должны использовать формат CamelCase, то есть первая буква каждого идентификатора должна быть заглавной, а первая буква встроенных слов также должна быть заглавной. То же самое относится и к сокращениям. это только первая буква.
МойИдентификатор
МойFTPКласс
Основным исключением из этого правила является случай перевода файлов заголовков, который должен соответствовать соглашениям об именах, принятым в исходных файлах заголовков. Например:
WM_LBUTTONDOWN, wm_LButtonDown не пишите.
За исключением переводов файлов заголовков, не используйте подчеркивания для разделения слов. Имена классов должны быть существительными или именными фразами. Имя интерфейса или класса зависит от очевидного назначения и использования интерфейса.
Доброе имя:
АдресФорма, ArrayIndexOutOfBoundsException
Плохие имена:
ManageLayout //Используем глагольную фразу
delphi_is_new_to_me //Используйте подчеркивание
3.1 Именование устройства
См. декларацию устройства
3.2 Именование классов/интерфейсов
См. объявление класса/интерфейса.
3.3 Именование домена/поля
Используйте формат CamelCase. Начните с заглавной буквы «F» и объявите все данные конфиденциально, используя свойства или методы получения и установки для обеспечения публичного доступа. Например: используйте имя GetSomething, чтобы назвать функцию, которая возвращает внутреннее поле/значение поля, и используйте SetSomething, чтобы назвать процедуру, которая устанавливает значение поля/поля.
Не используйте все заглавные буквы в разделах const, если это не требуется для перевода файла заголовка.
Delphi был разработан в Калифорнии, поэтому мы не рекомендуем использовать токены, если они не требуются для перевода заголовочного файла.
правильный:
FMyString: строка;
Неверно:
lpstrMyString: строка;
Конечно, венгерская номенклатура сохраняется в определении типа перечисления:
TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp,
bkДа, bkНет, bkClose, bkAbort, bkRetry,
bkignore, bkAll);
В этом случае символ bk вставляется перед каждым элементом этого типа перечисления. bk означает ButtonKind.
При рассмотрении соглашений об именах избегайте использования односимвольных имен, за исключением переменных с нулевым временем и переменных цикла.
Избегайте использования переменной «l» (L), поскольку ее трудно отличить от «1» (единицы) на принтере или мониторе.
3.4 Именование метода
Для именования методов также используется формат CamelCase. Соглашения об именах методов такие же, как и об именах неконстантных полей, но их можно отличить от контекста. Именование методов должно требовать использования глаголов или глагольных фраз. Например:
//Хорошее имя метода:
Шовстатус, DrawCircle, Аддлайауткомпонент
//Плохое имя метода:
MouseButton //именная группа, без функции описания
drawCircle //Начинаем со строчной буквы
add_layout_comComponent //Используется подчеркивание
//Функции следующих методов недостаточно ясны. Запускает ли он службу (лучше: StartServer) или определяет, запущена ли служба (лучше: IsServerRunning)?
ServerRunning //Глагольная фраза, но не команда
Метод получения или установки некоторых свойств класса должен называться GetProperty или SetProperty соответственно, где Property представляет собой имя свойства. Например:
ПолучитьВысоту, УстановитьВысоту
Метод, проверяющий логическое свойство класса, должен называться IsVisible, где Visible представляет имя свойства. Например:
IsResizable, IsVisible
3.5 Именование локальных переменных
Правила именования локальных переменных такие же, как и для полей/полей, за исключением того, что буква «F» не используется. См. раздел 3.3.
3.6 Зарезервированные слова
Зарезервированные слова и индикаторы должны быть написаны строчными буквами. Иногда это может немного сбивать с толку. Например: Целое число является идентификатором и отображается с заглавной первой буквой. Все зарезервированные слова строки написаны строчными буквами.
3.7 Объявление типа
Все объявления имен типов начинаются с буквы Т и следуют за тем же именем, что и класс.
4.0 Использование пустого пространства
4.1 Пустые строки
Пустые строки могут улучшить читаемость за счет группировки логически связанных сегментов кода. Пустую строку также можно использовать в следующих местах:
После блока комментариев об авторских правах следует объявление пакета (package) и раздел импорта (import).
между объявлениями классов.
между объявлениями методов.
4.2 Пространства
Object Pascal — очень понятный и читаемый язык. Обычно вам не нужно добавлять много пробелов для разделения строк кода. В следующих статьях представлены некоторые рекомендации по использованию пробелов:
4.2.2 Пробелы не следует использовать:
Между именем метода и открывающей скобкой;
До или после оператора .(точка);
между унарным оператором и его операндом;
Между типом и выражением, которое он приводит;
после левой скобки и перед правой скобкой;
после левой квадратной скобки и перед правой квадратной скобкой;
до бана;
Например:
//Правильное использование:
функция TMyClass.MyFunc (значение var: целое число);
MyPointer := @MyRecord;
МойКласс:= TMyClass(MyPointer);
MyInteger := MyIntegerArray[5];
//Неправильное использование:
функция TMyClass.MyFunc(значение var: целое число);
MyPointer := @MyRecord;
МойКласс := TMyClass (MyPointer);
MyInteger := MyIntegerArray [ 5 ] ;
4.3 Отступ
Вы всегда должны делать отступы на всех уровнях на два пробела. Другими словами, первый уровень имеет отступ в два пробела, второй уровень — в четыре пробела, третий уровень — в шесть пробелов... Не используйте символ табуляции Tab.
Конечно, есть еще несколько исключений. Зарезервированные слова, такие как единица измерения, использование, тип, интерфейс, реализация, инициализация и финализация, всегда находятся в верхнем регистре. Последний конечный идентификатор ячейки также является верхним уровнем. В файле проекта программа, а также основные начало и конец также находятся в верхней сетке. Отступ основного блока Begin..end должен составлять не менее двух пробелов.
4.4 Продолжение
Количество строк должно быть ограничено 80 столбцами. Строки с числом столбцов более 80 следует разделить на несколько последовательных строк. Все последующие строки должны следовать за первой строкой этого объявления и иметь отступ в два символа пробела.
Например:
//правильный:
функция CreateWindowEx(dwExStyle: DWord;
lpClassName: PChar; lpWindowName: PChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: целое число;
hWndParent: HWND; hМеню: HMENU; hInstance: HINST;
lpParam: Указатель ): HWND;
если ((X = Y) или (Y = X) или
(Z = P) или (F = J) , то
начинать
С := Дж;
конец ;
Не переносите строки между параметром и его типом, если список не разделен запятыми. В этом случае переносите строки перед последним параметром, чтобы имя типа начиналось на следующей строке. Между двоеточием и его переменной не должно быть пробела, а между двоеточием и именем типа должен быть один пробел.
//правильный:
процедура Foo(Param1: Integer; Param2: Integer);
//ошибка:
процедура Foo( Param :Integer; Param2:Integer);
Последующая строка не должна начинаться с бинарного оператора. Не обрезайте строку, где пробелы обычно не встречаются, например, между именем метода и его открывающей скобкой или между именем массива и его открывающей скобкой. Если вам необходимо разбить строку в описанной выше ситуации, разорвите строку после открывающей скобки или открывающей квадратной скобки. Не помещайте начало в ту же строку, что и остальной код.
Например:
//ошибка:
в то время как ( LongExpression1 или LongExpression2) начинаются
//Делай что-нибудь
//ДелатьЧто-тоЕще;
конец ;
//правильный
в то время как (LongExpression1 или longExpression2) делать
начинать
//Делай что-нибудь
//ДелатьЧто-тоЕще;
конец ;
если (LongExpressiong1) или
(ДлинноеВыражение2) или
(ДлинноеВыражение3), затем
5.0 Комментарии
Язык Object Pascal поддерживает два типа комментариев: блочные и однострочные комментарии. Вот несколько рекомендаций по использованию аннотаций:
·Полезно размещать комментарии в верхней части блока, объясняющие его назначение.
·Полезно размещать комментарии перед объявлениями классов.
·Полезно устанавливать аннотации перед объявлениями методов.
· Избегайте комментариев с очевидным смыслом.
i := i + 1 //Добавляем единицу к i
· Помните, что комментарии, которые легко неверно истолковать, более вредны, чем отсутствие комментариев вообще.
·Избегайте размещения в комментариях информации, которая кажется недействительной.
·Избегайте встраивания звездочек и других типографских символов в рамки комментариев.
· Комментарии «нулевого часа», то есть комментарии, которые необходимо изменить или удалить, должны быть помечены знаком «???:» перед ними, чтобы их можно было легко найти. Концептуально все комментарии с нулевым временем должны быть удалены до выпуска программы.
// ???: измените это на вызов Sort, когда оно исправлено
Список.MySort;
5.1 Блокировка комментариев
Object Pascal поддерживает два типа блочных комментариев. Чаще всего используются комментарии, заключенные в фигурные скобки {}. Команда Delphi старалась сделать комментарии как можно меньшими и простыми. Например: вам следует избегать использования звездочек для создания узоров или линий в ваших комментариях. Вместо этого используйте пробелы для разделения комментариев, как в текстовом документе. Слова в вашем комментарии должны начинаться на той же строке, что и первая фигурная скобка, как в следующем отрывке из DsgnIntf.pas:
{ TPropertyEditor
Редактирует свойство компонента или список компонентов.
выбранное в Инспекторе объектов свойство.
редактор создается на основе типа
свойство, редактируемое в соответствии с типами
зарегистрирован...
и т. д...
GetXxxValue
Получает значение первого свойства в
Свойства. Вызывает соответствующее свойство.
Метод TProperty GetXxxValue для получения
ценить.
SetXxxValue Устанавливает значение всех свойств.
в свойстве Properties. Вызывает соответствующее.
TProperty SetXxxxValue для установки значения }.
Блочные комментарии часто используются в комментариях об авторских правах. Также используется для комментирования некоторых строк кода.
Комментарий к блоку, объясняющий назначение метода, должен предшествовать объявлению метода.
Например:
// ПРАВИЛЬНЫЙ
{ TMyObject.MyMethod
Эта процедура позволяет выполнять код. }
процедура TMyObject.MyMethod;
начинать
конец;
// НЕПРАВИЛЬНО
процедура TMyObject.MyMethod;
{************************************************ * ****
TMyObject.MyMethod
Эта процедура позволяет выполнять код.
************************************************* * *****}
начинать
конец;
Второй тип комментария к блоку содержит два символа, круглые скобки и звездочку: (* *). Иногда это называют комментарием в звездной скобке. Эти аннотации обычно полезны только во время разработки кода, и их основное преимущество заключается в том, что они позволяют вложенным аннотациям иметь глубину менее двух уровней. Object Pascal не поддерживает один и тот же тип вложенности комментариев, поэтому на самом деле существует только один уровень вложенности: фигурные скобки внутри звездчатых скобок или звездчатые скобки внутри фигурных скобок. Стандартные аннотации Pascal других типов внутри аннотаций этого типа будут игнорироваться, пока вы не вложите их. Таким образом, вы можете использовать этот синтаксис для закомментирования большого блока кода, содержащего как код, так и комментарии:
(* процедура TForm1.Button1Click(Отправитель: TObject);
начинать
DoThis // Запускаем процесс;
DoThat // Продолжить итерацию;
{ Здесь нам нужен способ сообщать об ошибках, возможно, используя
попробовать наконец заблокировать ???
CallMoreCode // Завершаем процесс;
конец ; *)
В этом случае закомментируется весь метод Button1Click, включая все вложенные комментарии внутри него.
5.2 Однострочные комментарии
Однострочный комментарий состоит из символа комментария // и его начального текста с пробелом между текстом и символом комментария. Если однострочные комментарии находятся на разных строках, чем код, они должны иметь тот же уровень отступа, что и код. Вы можете использовать несколько однострочных комментариев для формирования большого комментария.
Пустая строка обязательна перед однострочным комментарием или группой комментариев, если только это не первая строка блока. Если комментарии используются для нескольких операторов, после комментариев и групп комментариев должна идти пустая строка. Если комментарий поясняет только утверждение в следующей за ним строке, за ним не обязательно должна идти пустая строка.
Например:
//Открываем базу данных
Таблица1.Открыть;
Однострочные комментарии также могут следовать за поясняемыми ими объявлениями кода. Такие комментарии иногда называют отслеживающими комментариями. Между ними и кодом должен быть хотя бы один пробел. Если в блоке кода одновременно появляется несколько комментариев трассировки, эти комментарии необходимо выровнять.
Например:
если ( не IsVisible), то
Выход // нечего делать
Inc(StrLength); // резервируем место для нулевого терминатора
Избегайте отслеживания комментариев к каждой строке исполняемого кода. Обычно лучше ограничить использование комментариев или даже оставить их пустыми между блоками Begin...End метода или функции. Длинные комментарии могут появляться в комментариях блоков перед определением методов и функций.
добрый
6.1 Организация занятий
Организация классных органов должна осуществляться в следующем порядке:
·Декларация домена/поля
·Объявление метода
·Определение атрибута
Домены/поля, свойства и методы должны быть пронумерованы в алфавитном порядке по их именам.
6.1.1 Уровни доступа
За исключением кода, созданного средой IDE, указатели области действия классов должны располагаться в следующем порядке:
·личное заявление
·защитить заявление
·публичное заявление
·Опубликованное заявление
В Object Pascal члены класса имеют четыре уровня доступа: опубликованный, общедоступный, защищенный и частный — в порядке убывания возможностей доступа. Опубликован уровень доступа по умолчанию. Как правило, участнику должен быть назначен самый низкий уровень доступа, наиболее подходящий для него. Например: члены, к которым могут получить доступ только другие классы в том же модуле, должны быть объявлены закрытыми. В то же время объявление членов с низкими уровнями доступа также дает компилятору возможность улучшить оптимизацию. Конечно, с другой стороны, использование низких уровней доступа затрудняет расширение подклассов. Если есть основания полагать, что в какой-то момент в будущем класс будет разделен на подклассы, то те члены, которые должны быть унаследованы и расширены подклассом, должны быть объявлены как защищенные. Свойства, используемые для доступа к частным данным, также могут обеспечить такую защиту.
Вам следует запретить публичный доступ к данным. Данные обычно объявляются в частном разделе, и любой публичный доступ к ним должен осуществляться через методы или свойства GetXXX, SetXXX.
6.1.8 Объявление конструктора
Методы необходимо отсортировать по алфавитному индексу. Конструкторы и деструкторы правильно размещать в начале публичного раздела или располагать их в алфавитном порядке.
Если существует несколько конструкторов или вы используете несколько конструкторов с одним и тем же именем, их следует расположить в соответствии со списком параметров: конструктор с наименьшим количеством параметров находится перед конструктором с наибольшим количеством параметров. Это значит, что если есть конструктор без параметров, то он должен появиться первым. Чтобы обеспечить наилучшую совместимость с C++Builder, список параметров конструктора должен быть уникальным. C++ не вызывает конструктор по его имени, поэтому единственный способ отличить несколько конструкторов — это использовать список его аргументов.
6.2 Объявление метода
Если возможно, объявления методов должны располагаться в одной строке.
Например:
Примеры:
процедура ImageUpdate (изображение img, информационные флаги: целое число,
x: целое число, y: целое число, w: целое число, h: целое число)
7.0 Интерфейс
Объявление интерфейса имеет ту же форму, что и объявление класса:
ИмяИнтерфейса = интерфейс ([ унаследованный интерфейс ])
Тело интерфейса
конец ;
Объявления интерфейсов должны иметь отступ в два пробела, тела интерфейса — четыре пробела, а конечные символы — два пробела.
В объявлении интерфейса нет полей/полей. Но атрибуты могут появиться.
Все методы интерфейса по своей сути являются открытыми и абстрактными, и нет необходимости включать такие ключевые слова в объявление интерфейса.
Если не указано иное, объявления интерфейса имеют тот же стиль, что и объявления того же типа.
7.1 Организация тела интерфейса
Тело интерфейса можно организовать в следующем порядке:
·Объявление метода интерфейса
·Объявление атрибута интерфейса
Методы и свойства интерфейса объявляются в том же стиле, что и классы.
8.0 Заявление
Оператор — это строка или строки кода, заканчивающиеся печатью. Один оператор имеет только один номер запрета, а составной оператор имеет несколько имен запрета.
//Это один оператор:
А := Б;
//Это составной оператор:
начинать
Б := С;
А := Б;
конец ;
8.0.1 Единая декларация
Если необходимо обернуть один оператор, его необходимо сделать с отступом на два пробела относительно предыдущей строки.
//Например:
Мое значение :=
MyValue + (SomeVeryLongStatement/OtherLongStatement);
8.1.1 Объявления присваивания и выражения
В каждой строке может быть не более одного оператора.
Например:
а := b + c; Inc(Count); //Ошибка;
а := б + с // Верно ;
Inc(Счетчик); //Правильно
8.1.2 Объявление локальной переменной
Локальные переменные также используют формат CamelCase. Не используйте лидер «F», который зарезервирован для полей/полей в объявлениях классов.
Например:
вар
МоиДанные: целое число;
МояСтрока: строка ;
Вы можете объявить несколько переменных одного типа в одной строке:
вар
ArraySize, ArrayCount: целое число;
Эта привычка объявления не рекомендуется в объявлениях классов.
8.1.3 Объявление массива
Обычно перед открывающей скобкой и после закрывающей скобки всегда ставят пробел:
тип
TMyArray = массив [0..100] символов ;
8.2.3 оператор if
Оператор if должен состоять как минимум из двух строк:
Например:
//ошибка:
если A = B, то DoSomething;
//правильный
если А = В, то
Сделать что-нибудь;
Если это составной оператор if, для каждого разделителя должна быть новая строка:
//ошибка:
если A = B, то начнем
Сделать что-нибудь;
сделать что-нибудь еще;
конец еще начнется
Сделайте это;
Сделайте это;
конец ;
//правильный
если А = В, то
начинать
Сделать что-нибудь;
сделать что-нибудь еще;
конец
еще
начинать
Сделайте это;
Сделайте это;
конец ;
Можно принять несколько вариантов следующих вариантов:
//правильный
если Условие тогда
начинать
Сделайте это;
закончить еще
начинать
Сделайте это;
конец ;
//правильный
если Условие тогда
начинать
Сделайте это;
конец
еще
Сделать что-нибудь;
//правильный
если Условие тогда
начинать
Сделайте это;
закончить еще
Сделать Что-нибудь;
//Следующий метод, возможно, не заслуживает внимания, но он достоин похвалы:
если Условие тогда
Сделай это
еще Сделай Это;
8.2.4 для заявления
Пример:
// НЕПРАВИЛЬНО
для i := от 0 до 10 начать
Сделать что-нибудь;
сделать что-нибудь еще;
конец ;
// ПРАВИЛЬНЫЙ
для i := от 0 до 10 делать
начинать
Сделать что-нибудь;
сделать что-нибудь еще;
конец ;
8.2.5 оператор while
Пример:
// НЕПРАВИЛЬНО
пока x < ; j начинается
Сделать что-нибудь;
сделать что-нибудь еще;
конец ;
// ПРАВИЛЬНЫЙ
пока x < j делаю
начинать
Сделать что-нибудь;
сделать что-нибудь еще;
конец ;
8.2.6 повторять до утверждения
Пример:
// ПРАВИЛЬНЫЙ
повторить
х := j;
j := ОбновлениеЗначения;
до j = 25;
8.2.7 оператор случая
Пример:
// ПРАВИЛЬНЫЙ
Case Control.Align of
alLeft, alNone: NewRange := Max(NewRange, Position);
alRight: Inc(AlignMargin, Control.Width);
конец ;
// ПРАВИЛЬНЫЙ
случай х из
CSSстарт:
начинать
j := ОбновлениеЗначения;
конец ;
csBegin: х: = j;
csTimeOut:
начинать
j := х;
х:= ОбновлениеЗначения;
конец ;
конец ;
// ПРАВИЛЬНЫЙ
случай ScrollCode of
SB_LINEUP, SB_LINEDOWN:
начинать
Incr := FIncrement div FLineDiv;
FinalIncr := FIncrement мод FLineDiv;
Количество: = FLineDiv;
конец ;
SB_PAGEUP, SB_PAGEDOWN:
начинать
Увеличение := FPageIncrement;
FinalIncr := Увеличение мод FPageDiv;
Увеличение := Увеличение div FPageDiv;
Количество: = FPageDiv;
конец ;
еще
Счет:= 0;
Инкр := 0;
ФиналИнкр := 0;
конец ;
8.2.8 оператор попытки
//Правильный
пытаться
пытаться
EnumThreadWindows (CurrentThreadID, @Disable, 0);
Результат: = TaskWindowList;
кроме
EnableTaskWindows (TaskWindowList);
поднимать ;
конец ;
окончательно
TaskWindowList := SaveWindowList;
TaskActiveWindow: = SaveActiveWindow;
конец ;
Блог автора: http://blog.csdn.net/sailerbai/