Процедуры и функции 1. Именование и формат (1) Имена процедур должны начинаться с заглавной буквы, а прописные и строчные буквы должны располагаться в шахматном порядке для удобства чтения. Ниже приведен неправильный способ написания: PROcedure thisisaporlyformattedroutinename; измените его на следующее: Подпрограмму, выполняющую действие, лучше всего начинать с глагола, обозначающего действие. Например: процедура FormatHardDrive; Имя подпрограммы, которая устанавливает значение входного параметра, должно иметь префикс Set, например: процедура SetUserName; Имя подпрограммы, которая получает значение, должно иметь префикс Get, например: function GetUserName: string; Формальные параметры ( 1) Формат: По возможности формальные параметры одного типа следует группировать вместе. Например: процедура ИмяПроцедуры (Param1, Param2, Param3: Integer; Param4: string); (2) Именование: имена всех формальных параметров должны отражать их назначение. Если возможно, имена формальных параметров должны начинаться с буквы A. Например: процедура ИмяПроцедуры (AUserName: строка; AUserAge: целое число); Если имя параметра совпадает с именем атрибута или поля класса, необходим префикс A. (3) Порядок параметров. Порядок формальных параметров в основном зависит от правил вызова регистров. Наиболее часто используемым параметром должен быть первый параметр, расположенный слева направо в порядке частоты использования. Входные параметры предшествуют выходным параметрам. Параметры с большим диапазоном следует размещать перед параметрами с небольшим диапазоном. Например: процедура ИмяПроцедуры (APlanet, AContinent, ACuntry, AState, ACity). Некоторые из них являются исключениями. Например: во время обработки события параметр Sender типа TObject часто является первым передаваемым параметром. (4) Постоянные параметры: чтобы предотвратить изменение параметров записи, массива, короткой строки или типа интерфейса подпрограммой, формальные параметры должны быть помечены как Const. Таким образом, компилятор будет генерировать код наиболее эффективным способом, гарантируя неизменяемость передаваемых параметров. Если другие типы параметров не будут изменены программой, их также можно пометить C onst. Хотя это не влияет на эффективность, но дает вызывающему подпрограмму больше информации. (5) Конфликт имен: когда два модуля содержат подпрограммы с одинаковым именем, при вызове подпрограммы фактически вызывается подпрограмма в модуле, который появляется позже в разделе Uses. Чтобы избежать такой ситуации, вы можете добавить нужное имя модуля перед именем метода, например: SysUtils.FindClose(SR);Windows.FindClose(Handle);3. Переменные (1) Именование и формат переменных: имя переменной должно отражать ее назначение. Переменные управления контуром часто представляют собой отдельные буквы, такие как I, J или K. Вы также можете использовать более осмысленное имя, например UserIndex; имена логических переменных должны четко указывать значение значений True и False. (2) Локальные переменные. Локальные переменные используются внутри подпрограмм и соответствуют правилам именования других переменных. При необходимости переменные следует инициализировать сразу при входе в процедуру. Локальные переменные типа AnsiString автоматически инициализируются пустыми строками; переменные типа локального интерфейса и dispinterface автоматически инициализируются значением nil; локальные переменные типа Variant и OleVariant автоматически инициализируются значением Unassigned. (3) Глобальные переменные. Использование глобальных переменных обычно не рекомендуется. Однако иногда это необходимо. Несмотря на это, глобальные переменные должны быть ограничены средами, где они необходимы. Глобальные переменные могут быть глобальными только в части реализации модуля, глобальные данные, если они будут использоваться многими модулями, должны быть перемещены в общий модуль и использоваться всеми объектами, глобальные данные могут быть напрямую инициализированы значением при объявлении; . (Обратите внимание, что все глобальные переменные автоматически инициализируются нулями, поэтому не инициализируйте глобальные переменные нулевыми значениями, такими как 0, nil или Unassigned. Глобальные переменные, инициализированные нулем, не занимают места в файле .EXE. Инициализированные нулями. данные сохраняются в сегменте виртуальных данных, сегмент виртуальных данных выделяет память только при запуске приложения. Ненулевые инициализированные глобальные данные занимают место в EXE-файле) 4. Правила регистра для типа(1): Идентификаторы типа являются зарезервированными словами и должны быть записаны строчными буквами. Типы API Win32 часто пишутся с заглавной буквы и следуют правилам для имен конкретных типов, таких как Windows.pas или других модулей API. Для других имен переменных первая буква должна быть заглавной, а остальные буквы — в чередующемся регистре. Например: varMyString: string; // Зарезервированное слово WindowsHandle: HWND; // Тип Win32 API I: Integer; // Идентификатор типа, представленный в системном модуле (2) Тип с плавающей запятой: использование типа Real не рекомендуется, поскольку это просто Зарезервировано для совместимости со старым кодом Pascal. Обычно Double следует использовать для чисел с плавающей запятой. Double может быть оптимизирован процессором и является стандартным форматом данных, определенным IEEE. Расширение можно использовать, когда требуется больший диапазон, чем обеспечивает Double. Extend — это тип, специфичный для Intel, и не поддерживается Java. Когда физическое количество байтов переменной с плавающей запятой важно (возможно, используется другой язык для записи DLL), следует использовать Single. (3) Тип перечисления. Имя типа перечисления должно отражать цель перечисления. Перед именем должен стоять символ T, чтобы указать, что это тип данных. Префикс списка идентификаторов перечисляемого типа должен содержать от 2 до 3 символов нижнего регистра для связи друг с другом. Например: TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB Имя экземпляра переменной перечислимого типа такое же, как и тип, но без префикса T. Вы также можете присвоить переменной больше); специальное имя, например: FavoriteSongTpe1, FavoriteSongTpe2 и т. д. подождите. (4)Variant и OleVariant: Обычно не рекомендуется использовать Variant и OleVariant. Однако эти два типа необходимы для программирования, когда тип данных известен только во время выполнения (часто в приложениях COM и баз данных). При программировании через COM, например при автоматизации элементов управления ActiveX, вам следует использовать OleVariant, а для программирования, отличного от COM, следует использовать Variant; Это связано с тем, что Variant может эффективно сохранять собственные строки Delphi, в то время как OleVariant преобразует все строки в строки OLE (т. е. строки Wide Char) без подсчета ссылок. 5. Составной тип (1) Тип массива: имя типа массива должно отражать назначение массива. Имена типов должны начинаться с буквы Т. Если вы хотите объявить указатель на тип массива, вы должны поставить перед ним букву P и объявить его перед объявлением типа. Например: typePCycleArray = ^TCycleArray; TCycleArray=массив [1..100] целого числа Фактически, экземпляр переменной типа массив имеет то же имя, что и тип, но без префикса T. (2) Тип записи. Название типа записи должно отражать цель записи. Имена типов должны начинаться с буквы Т. Если вы хотите объявить указатель на тип записи, вы должны поставить перед ним букву P и объявить его перед объявлением типа. Например: typePStudent = ^ TStudent;TStudent = RecordStudentName: string;StudentAge: Double;6. Классы (1) Именование и формат Имя класса должно отражать назначение класса. Буква T добавляется перед именем класса, чтобы указать, что это тип. Например: typeTStudent= class (TObject); Имя экземпляра класса такое же, как и имя класса, но без префикса T. varStudent: TStudent; Обратите внимание, что информацию об именах компонентов см. в разделе 6.6 «Компоненты». (2) Именование и формат полей. Именование полей соответствует тем же правилам, что и переменные, за исключением того, что добавляется префикс F, указывающий, что это поле. Видимость: все поля должны быть закрытыми. Если вы хотите получить доступ к полю вне области действия класса, вы можете сделать это с помощью атрибутов класса. (3) Именование и формат метода. Именование методов соответствует тем же правилам, что и процедуры и функции. Статические методы. Статические методы следует использовать, если вы не хотите, чтобы метод был переопределен производными классами. Виртуальные методы и динамические методы. Если вы хотите, чтобы метод был переопределен производным классом, вам следует использовать виртуальные методы. Если метод класса должен использоваться прямо или косвенно несколькими производными классами, следует использовать динамические методы. Например, если класс содержит часто переопределяемый метод и имеет 100 производных классов, метод следует определить как динамический, что может уменьшить нагрузку на память. Абстрактные методы: если класс должен создавать экземпляры, не используйте абстрактные методы. Абстрактные методы можно использовать только в базовых классах, которые никогда не создают экземпляры. Методы доступа к свойствам. Все методы доступа к свойствам должны быть определены в частной или защищенной части класса. Методы доступа к свойствам подчиняются тем же правилам, что и процедуры и функции. Метод, используемый для чтения, должен иметь префикс Get, а метод, используемый для записи, должен иметь префикс Set и иметь параметр Value, тип которого совпадает с типом атрибута. Например: TStudent = class (TObject)privateFName: string;protectedfunction GetName: string;procedure SetName (Value: string);имя publicproperty: чтение строки GetName запись SetName;end;(4) Свойства свойства служат средствами доступа к частным полям и следуют за ними. то же Поля имеют одинаковые правила именования, но без префикса F. Имена свойств должны быть существительными, а не глаголами. Свойства — это данные, а методы — это действия. Имена свойств массива должны быть во множественном числе, а общие свойства — в единственном числе. (5) Хотя использование методов доступа не является обязательным, рекомендуется использовать методы доступа для записи для доступа к свойствам, представляющим частные поля.