Procédures et fonctions 1. Dénomination et format (1) Les noms de procédures doivent commencer par une lettre majuscule, et les lettres majuscules et minuscules doivent être décalées pour augmenter la lisibilité. Ce qui suit est une manière d'écrire incorrecte : PRocedure thisisapoorlyformattedroutinename ; remplacez-le par ceci : procédure ThisIsMuchMoreReadableRoutineName (2) Le nom du processus doit être significatif. Il est préférable de préfixer son nom avec le verbe qui représente l'action. Par exemple : procédure FormatHardDrive ; Le nom de la routine qui définit la valeur du paramètre d'entrée doit être préfixé par Set, par exemple : procédure SetUserName ; Le nom de la routine qui obtient la valeur doit être préfixé par Get, par exemple : function GetUserName : string ; Paramètres formels ( 1) Format : Dans la mesure du possible, les paramètres formels du même type doivent être regroupés. Par exemple : procédure ProcedureName (Param1, Param2, Param3 : Integer ; Param4 : string) ; (2) Naming : Les noms de tous les paramètres formels doivent exprimer leur objectif. Le cas échéant, les noms de paramètres formels doivent être préfixés par la lettre A. Par exemple : procédure ProcedureName (AUserName : string ; AUserAge : integer) ; Lorsque le nom du paramètre a le même nom qu'un attribut ou un champ de classe, le préfixe A est nécessaire. (3) Ordre des paramètres : L'ordre des paramètres formels dépend principalement des règles d'appel du registre. Le paramètre le plus couramment utilisé doit être le premier paramètre, disposé de gauche à droite par ordre de fréquence d’utilisation. Les paramètres d’entrée précèdent les paramètres de sortie. Les paramètres avec une large plage doivent être placés avant les paramètres avec une petite plage. Par exemple : procédure ProcedureName (APlanet, AContinent, ACountry, AState, ACity). Certaines sont des exceptions. Par exemple : Lors du traitement des événements, le paramètre Sender de type TObject est souvent le premier paramètre à être passé. (4) Paramètres constants : pour éviter que les paramètres de type enregistrement, tableau, chaîne courte ou interface ne soient modifiés par la routine, les paramètres formels doivent être marqués comme Const. De cette façon, le compilateur générera du code de la manière la plus efficace, garantissant que les paramètres transmis sont immuables. Si d'autres types de paramètres ne devraient pas être modifiés par la routine, ils peuvent également être marqués avec C onst. Bien que cela n’ait aucun impact sur l’efficacité, cela donne plus d’informations à l’appelant de la routine. (5) Conflit de nom : lorsque deux unités contiennent des routines portant le même nom, si la routine est appelée, la routine de l'unité qui apparaît plus tard dans la clause Uses est en fait appelée. Pour éviter cette situation, vous pouvez ajouter le nom de l'unité souhaitée avant le nom de la méthode, par exemple : SysUtils.FindClose (SR);Windows.FindClose(Handle);3. Variables (1) Nom et format des variables : Le nom d'une variable doit pouvoir exprimer son objectif. Les variables de contrôle de boucle sont souvent des lettres simples telles que I, J ou K. Vous pouvez également utiliser un nom plus significatif, tel que UserIndex ; les noms de variables booléennes doivent clairement indiquer la signification des valeurs True et False. (2) Variables locales : les variables locales sont utilisées dans les routines et suivent les règles de dénomination des autres variables. Si nécessaire, les variables doivent être initialisées immédiatement à l'entrée de la routine. Les variables locales de type AnsiString sont automatiquement initialisées avec des chaînes vides ; les variables locales de type interface et dispinterface sont automatiquement initialisées à zéro ; les variables locales de type Variant et OleVariant sont automatiquement initialisées à Unassigned. (3) Variables globales : L'utilisation de variables globales est généralement déconseillée. Cependant, cela est parfois nécessaire. Même ainsi, les variables globales doivent être limitées aux environnements où elles sont nécessaires. Les variables globales ne peuvent être globales que dans la partie implémentation de l'unité ; les données globales, si elles doivent être utilisées par de nombreuses unités, doivent être déplacées vers une unité commune et utilisées par tous les objets. Les données globales peuvent être directement initialisées à une valeur lorsqu'elles sont déclarées ; . (Notez que toutes les variables globales sont automatiquement initialisées à zéro, n'initialisez donc pas les variables globales à des valeurs nulles telles que 0, nil ou Unassigned. Les variables globales initialisées à zéro ne prennent pas de place dans le fichier .EXE. Initialisées à zéro les données sont enregistrées dans Dans le segment de données virtuelles, le segment de données virtuelles n'alloue de la mémoire que lorsque l'application est démarrée. Les données globales initialisées non nulles occupent de l'espace dans le fichier EXE) 4. Règles de casse de type (1) : les identifiants de type sont des mots réservés et doivent être tous en minuscules. Les types d'API Win32 sont souvent en majuscules et suivent des règles pour des noms de types spécifiques tels que Windows.pas ou d'autres unités API. Pour les autres noms de variables, la première lettre doit être en majuscule et les autres lettres doivent être en casse alternée. Par exemple : varMyString : string ; // Mot réservé WindowsHandle : HWND ; // Type d'API Win32 I : Integer ; // Identificateur de type introduit dans l'unité système (2) Type à virgule flottante : L'utilisation du type Real est déconseillée car elle est simplement Réservé à la compatibilité avec l'ancien code Pascal. Normalement, Double doit être utilisé pour les nombres à virgule flottante. Double peut être optimisé par le processeur et est un format de données standard défini par l'IEEE. Extend peut être utilisé lorsqu’une portée plus grande que celle fournie par Double est requise. Extend est un type spécifique à Intel et n'est pas pris en charge par Java. Lorsque le nombre physique d'octets de la variable à virgule flottante est important (peut-être en utilisant un langage différent pour écrire la DLL), Single doit être utilisé. (3) Type d'énumération : le nom du type d'énumération doit représenter le but de l'énumération. Le caractère T doit être préfixé avant le nom pour indiquer qu'il s'agit d'un type de données. Le préfixe de la liste d'identifiants de type énumération doit contenir 2 à 3 caractères minuscules à associer entre eux. Par exemple : TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB); Le nom de l'instance de variable du type énumération est le même que le type, mais sans le préfixe T. Vous pouvez également attribuer un plus à la variable. nom spécial, tel que : FavoriteSongTpe1, FavoriteSongTpe2, etc. attendez. (4) Variant et OleVariant : il n'est généralement pas recommandé d'utiliser Variant et OleVariant. Cependant, ces deux types sont nécessaires à la programmation lorsque le type de données n'est connu qu'au moment de l'exécution (souvent dans les applications COM et de base de données). Lorsque vous effectuez une programmation COM telle que l'automatisation des contrôles ActiveX, vous devez utiliser OleVariant ; pour la programmation non-COM, vous devez utiliser Variant. En effet, Variant peut enregistrer efficacement les chaînes natives de Delphi, tandis qu'OleVariant convertit toutes les chaînes en chaînes OLE (c'est-à-dire, chaînes Wide Char) sans compter les références. 5. Type construit (1) Type de tableau : le nom du type de tableau doit exprimer le but du tableau. Les noms de types doivent être préfixés par la lettre T. Si vous souhaitez déclarer un pointeur vers un type tableau, vous devez le préfixer de la lettre P et le déclarer avant la déclaration de type. Par exemple : typePCycleArray = ^TCycleArray; TCycleArray=array [1..100] of integer En fait, l'instance variable du type tableau a le même nom que le type, mais sans le préfixe T. (2) Type d'enregistrement : le nom du type d'enregistrement doit exprimer l'objectif de l'enregistrement. Les noms de types doivent être préfixés par la lettre T. Si vous souhaitez déclarer un pointeur vers un type d'enregistrement, vous devez le préfixer de la lettre P et le déclarer avant la déclaration de type. Par exemple : typePStudent = ^ TStudent;TStudent = recordStudentName: string;StudentAge: Double;6. Classes (1) Dénomination et format Le nom d'une classe doit exprimer son objectif. La lettre T est ajoutée avant le nom de la classe pour indiquer qu'il s'agit d'un type. Par exemple : typeTStudent= class (TObject) ; Le nom d'instance de la classe est le même que le nom de la classe, mais sans le préfixe T. varStudent : TStudent ; Notez qu'en ce qui concerne la dénomination des composants, veuillez vous référer à la section 6.6 « Composants ». (2) Dénomination et format des champs : La dénomination des champs suit les mêmes règles que les variables, sauf que le préfixe F est ajouté pour indiquer qu'il s'agit d'un champ. Visibilité : Tous les champs doivent être privés. Si vous souhaitez accéder à un champ en dehors de la portée d'une classe, vous pouvez le faire à l'aide des attributs de classe. (3) Dénomination et format des méthodes : la dénomination des méthodes suit les mêmes règles que les procédures et les fonctions. Méthodes statiques : les méthodes statiques doivent être utilisées lorsque vous ne souhaitez pas qu'une méthode soit remplacée par des classes dérivées. Méthodes virtuelles et méthodes dynamiques : lorsque vous souhaitez qu'une méthode soit remplacée par une classe dérivée, vous devez utiliser des méthodes virtuelles. Si une méthode de classe doit être utilisée directement ou indirectement par plusieurs classes dérivées, des méthodes dynamiques doivent être utilisées. Par exemple, si une classe contient une méthode fréquemment remplacée et possède 100 classes dérivées, la méthode doit être définie comme dynamique, ce qui peut réduire la surcharge de mémoire. Méthodes abstraites : si une classe doit créer des instances, n'utilisez pas de méthodes abstraites. Les méthodes abstraites ne peuvent être utilisées que dans des classes de base qui ne créent jamais d'instances. Méthodes d'accès aux propriétés : toutes les méthodes d'accès aux propriétés doivent être définies dans la partie privée ou protégée de la classe. Les méthodes d'accès aux propriétés suivent les mêmes règles que les procédures et les fonctions. La méthode utilisée pour la lecture doit être préfixée par Get, et la méthode utilisée pour l'écriture doit être préfixée par Set et avoir un paramètre appelé Value dont le type est le même que le type de l'attribut. Par exemple : TStudent = class (TObject)privateFName : string;protectedfunction GetName : string;procedure SetName (Value : string);publicproperty Name : string read GetName write SetName;end;(4) Les propriétés de propriété servent d'accesseurs aux champs privés et suivent le même Les champs ont les mêmes règles de dénomination, mais sans le préfixe F. Les noms de propriétés doivent être des noms et non des verbes. Les propriétés sont des données et les méthodes sont des actions. Les noms de propriétés de tableau doivent être au pluriel, tandis que les propriétés générales doivent être au singulier. (5) Bien que l'utilisation de méthodes d'accès ne soit pas obligatoire, il est recommandé d'utiliser des méthodes d'accès en écriture pour accéder aux propriétés représentant les champs privés.