Prozeduren und Funktionen 1. Benennung und Format (1) Prozedurnamen sollten mit einem Großbuchstaben beginnen und die Groß- und Kleinbuchstaben sollten gestaffelt sein, um die Lesbarkeit zu verbessern. Das Folgende ist eine falsche Schreibweise: PROcedure thisisapoorlyformattedroutinename; ändern Sie es in Folgendes: procedure ThisIsMuchMoreReadableRoutineName (2) Der Prozessname sollte aussagekräftig sein. Einer Routine, die eine Aktion ausführt, wird am besten das Verb vorangestellt, das die Aktion darstellt. Zum Beispiel: procedure FormatHardDrive; Dem Routinenamen, der den Eingabeparameterwert festlegt, sollte Set vorangestellt werden, zum Beispiel: procedure SetUserName; Dem Routinenamen, der den Wert abruft, sollte Get vorangestellt werden, zum Beispiel: function GetUserName: string 2. Formale Parameter (1) Format: Formale Parameter desselben Typs sollten nach Möglichkeit in Gruppen zusammengefasst werden. Zum Beispiel: procedure ProcedureName (Param1, Param2, Param3: Integer; Param4: string); (2) Benennung: Die Namen aller formalen Parameter sollten ihren Zweck ausdrücken. Gegebenenfalls sollte formalen Parameternamen der Buchstabe A vorangestellt werden. Beispiel: procedure ProcedureName (AUserName: string; AUserAge: integer); Wenn der Parametername denselben Namen wie ein Klassenattribut oder -feld hat, ist das Präfix A erforderlich. (3) Parameterreihenfolge: Die Reihenfolge der formalen Parameter hängt hauptsächlich von den Registeraufrufregeln ab. Der am häufigsten verwendete Parameter sollte der erste Parameter sein, geordnet von links nach rechts in der Reihenfolge der Verwendungshäufigkeit. Eingabeparameter stehen vor Ausgabeparametern. Parameter mit großem Bereich sollten vor Parametern mit kleinem Bereich platziert werden. Beispiel: procedure ProcedureName (APlanet, AContinent, ACountry, AState, ACity). Einige davon sind Ausnahmen. Beispiel: Bei der Ereignisverarbeitung ist der Sender-Parameter vom Typ TObject häufig der erste Parameter, der übergeben wird. (4) Konstante Parameter: Um zu verhindern, dass Parameter des Datensatz-, Array-, Kurzstring- oder Schnittstellentyps von der Routine geändert werden, sollten die formalen Parameter als Const markiert werden. Auf diese Weise generiert der Compiler Code auf die effizienteste Weise und stellt sicher, dass die übergebenen Parameter unveränderlich sind. Wenn nicht erwartet wird, dass andere Parametertypen von der Routine geändert werden, können sie auch mit C onst markiert werden. Dies hat zwar keinen Einfluss auf die Effizienz, bietet dem Aufrufer der Routine jedoch mehr Informationen. (5) Namenskonflikt: Wenn zwei Einheiten Routinen mit demselben Namen enthalten und die Routine aufgerufen wird, wird tatsächlich die Routine in der Einheit aufgerufen, die später in der Uses-Klausel erscheint. Um diese Situation zu vermeiden, können Sie den gewünschten Unit-Namen vor dem Methodennamen hinzufügen, zum Beispiel: SysUtils.FindClose (SR);Windows.FindClose(Handle);3. Variablen (1) Benennung und Format von Variablen: Der Name einer Variable sollte ihren Zweck ausdrücken können. Schleifenkontrollvariablen bestehen häufig aus einzelnen Buchstaben wie I, J oder K. Sie können auch einen aussagekräftigeren Namen verwenden, z. B. „UserIndex“. Boolesche Variablennamen müssen die Bedeutung der Werte „True“ und „False“ klar angeben. (2) Lokale Variablen: Lokale Variablen werden innerhalb von Routinen verwendet und folgen den Benennungsregeln anderer Variablen. Bei Bedarf sollten Variablen sofort beim Eintritt in die Routine initialisiert werden. Lokale Variablen vom Typ AnsiString werden automatisch mit leeren Zeichenfolgen initialisiert. Lokale Variablen vom Typ „Schnittstelle“ und „Dispinterface“ werden automatisch mit Null initialisiert. Lokale Variablen vom Typ „Variant“ und „OleVariant“ werden automatisch mit „Nicht zugewiesen“ initialisiert. (3) Globale Variablen: Von der Verwendung globaler Variablen wird generell abgeraten. Manchmal ist es jedoch notwendig. Dennoch sollten globale Variablen auf die Umgebungen beschränkt werden, in denen sie benötigt werden. Globale Variablen dürfen nur im Implementierungsteil der Einheit global sein. Wenn sie von vielen Einheiten verwendet werden, sollten sie in eine gemeinsame Einheit verschoben werden, und globale Daten können bei der Deklaration direkt auf einen Wert initialisiert werden . (Beachten Sie, dass alle globalen Variablen automatisch mit Null initialisiert werden. Initialisieren Sie globale Variablen daher nicht mit Nullwerten wie 0, Null oder Nicht zugewiesen. Mit Null initialisierte globale Variablen belegen keinen Platz in der EXE-Datei. Mit Null initialisiert Daten werden im virtuellen Datensegment gespeichert, das virtuelle Datensegment reserviert nur Speicher, wenn die Anwendung gestartet wird. Nicht null initialisierte globale Daten belegen Platz in der EXE-Datei. Typ(1)-Fallregeln: Typbezeichner sind reservierte Wörter und sollten ausschließlich in Kleinbuchstaben geschrieben werden. Win32-API-Typen werden häufig vollständig in Großbuchstaben geschrieben und folgen Regeln für bestimmte Typnamen wie Windows.pas oder andere API-Einheiten. Bei anderen Variablennamen sollte der erste Buchstabe groß geschrieben werden und die anderen Buchstaben abwechselnd geschrieben werden. Zum Beispiel: varMyString: string; // Reserviertes Wort WindowsHandle: HWND; // Typbezeichner eingeführt in Systemeinheit (2) Gleitkommatyp: Von der Verwendung des Typs Real wird abgeraten, da dies einfach ist Reserviert für die Kompatibilität mit älterem Pascal-Code. Normalerweise sollte Double für Gleitkommazahlen verwendet werden. Double kann vom Prozessor optimiert werden und ist ein von IEEE definiertes Standarddatenformat. Extend kann verwendet werden, wenn eine größere Reichweite als Double erforderlich ist. Extend ist ein Intel-spezifischer Typ und wird von Java nicht unterstützt. Wenn die physische Anzahl der Bytes der Gleitkommavariablen wichtig ist (vielleicht bei Verwendung einer anderen Sprache zum Schreiben der DLL), sollte Single verwendet werden. (3) Aufzählungstyp: Der Name des Aufzählungstyps muss den Zweck der Aufzählung darstellen. Das T-Zeichen muss dem Namen vorangestellt werden, um anzuzeigen, dass es sich um einen Datentyp handelt. Das Präfix der Bezeichnerliste des Aufzählungstyps sollte 2 bis 3 Kleinbuchstaben enthalten, um sie miteinander zu verknüpfen. Zum Beispiel: TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB); Der Name der Variableninstanz des Aufzählungstyps ist derselbe wie der Typ, jedoch ohne das Präfix T. Sie können der Variablen auch ein „more“ geben spezieller Name, wie zum Beispiel: FavoriteSongTpe1, FavoriteSongTpe2 usw. warten. (4)Variant und OleVariant: Die Verwendung von Variant und OleVariant wird im Allgemeinen nicht empfohlen. Diese beiden Typen sind jedoch für die Programmierung erforderlich, wenn der Datentyp erst zur Laufzeit bekannt ist (häufig in COM- und Datenbankanwendungen). Wenn Sie COM-Programmierung durchführen, beispielsweise ActiveX-Steuerelemente automatisieren, sollten Sie OleVariant verwenden; für Nicht-COM-Programmierung sollten Sie Variant verwenden. Dies liegt daran, dass Variant die nativen Zeichenfolgen von Delphi effektiv speichern kann, während OleVariant alle Zeichenfolgen ohne Referenzzählung in OLE-Zeichenfolgen (dh Wide-Char-Zeichenfolgen) konvertiert. 5. Konstruierter Typ (1) Array-Typ: Der Name des Array-Typs sollte den Zweck des Arrays ausdrücken. Typnamen müssen den Buchstaben T voranstellen. Wenn Sie einen Zeiger auf einen Array-Typ deklarieren möchten, müssen Sie ihm den Buchstaben P voranstellen und ihn vor der Typdeklaration deklarieren. Zum Beispiel: typePCycleArray = ^TCycleArray; TCycleArray=array [1..100] of integer; Tatsächlich hat die Variableninstanz des Array-Typs denselben Namen wie der Typ, jedoch ohne das T-Präfix. (2) Datensatztyp: Der Name des Datensatztyps sollte den Zweck des Datensatzes zum Ausdruck bringen. Typnamen müssen den Buchstaben T voranstellen. Wenn Sie einen Zeiger auf einen Datensatztyp deklarieren möchten, müssen Sie ihm den Buchstaben P voranstellen und ihn vor der Typdeklaration deklarieren. Zum Beispiel: typePStudent = ^ TStudent;TStudent = recordStudentName: string;StudentAge: Double;6. Klassen (1) Benennung und Format Der Name einer Klasse sollte den Zweck der Klasse ausdrücken. Der Buchstabe T wird vor dem Klassennamen hinzugefügt, um anzuzeigen, dass es sich um einen Typ handelt. Zum Beispiel: typeTStudent= class (TObject); Der Instanzname der Klasse ist derselbe wie der Klassenname, jedoch ohne das Präfix T. varStudent: TStudent; Bitte beachten Sie bezüglich der Benennung von Komponenten Abschnitt 6.6 „Komponenten“. (2) Feldbenennung und -format: Die Benennung von Feldern folgt denselben Regeln wie Variablen, außer dass das Präfix F hinzugefügt wird, um anzuzeigen, dass es sich um ein Feld handelt. Sichtbarkeit: Alle Felder müssen privat sein. Wenn Sie auf ein Feld außerhalb des Geltungsbereichs einer Klasse zugreifen möchten, können Sie dies mithilfe von Klassenattributen tun. (3) Methodenbenennung und -format: Die Benennung von Methoden folgt denselben Regeln wie Prozeduren und Funktionen. Statische Methoden: Statische Methoden sollten verwendet werden, wenn Sie nicht möchten, dass eine Methode durch abgeleitete Klassen überschrieben wird. Virtuelle Methoden vs. dynamische Methoden: Wenn Sie möchten, dass eine Methode von einer abgeleiteten Klasse überschrieben wird, sollten Sie virtuelle Methoden verwenden. Wenn eine Klassenmethode direkt oder indirekt von mehreren abgeleiteten Klassen verwendet werden soll, sollten dynamische Methoden verwendet werden. Wenn eine Klasse beispielsweise eine häufig überschriebene Methode enthält und über 100 abgeleitete Klassen verfügt, sollte die Methode als dynamisch definiert werden, was den Speicheraufwand reduzieren kann. Abstrakte Methoden: Wenn eine Klasse Instanzen erzeugen soll, dann verwenden Sie keine abstrakten Methoden. Abstrakte Methoden können nur in Basisklassen verwendet werden, die niemals Instanzen erstellen. Eigenschaftenzugriffsmethoden: Alle Eigenschaftenzugriffsmethoden sollten im privaten oder geschützten Teil der Klasse definiert werden. Eigenschaftenzugriffsmethoden folgen denselben Regeln wie Prozeduren und Funktionen. Der zum Lesen verwendeten Methode sollte das Präfix „Get“ vorangestellt werden, und der zum Schreiben verwendeten Methode sollte das Präfix „Set“ vorangestellt werden und einen Parameter namens „Value“ haben, dessen Typ mit dem Typ des Attributs übereinstimmt. Zum Beispiel: TStudent = class (TObject)privateFName: string;protectedfunction GetName: string;procedure SetName (Value: string);publicproperty Name: string read GetName write SetName;end;(4) Eigenschaftseigenschaften dienen als Zugriffsmethoden für private Felder und folgen the same Die Felder haben die gleichen Benennungsregeln, jedoch ohne das F-Präfix. Eigenschaftsnamen sollten Substantive und keine Verben sein. Eigenschaften sind Daten und Methoden sind Aktionen. Namen von Array-Eigenschaften sollten im Plural vorliegen, während allgemeine Eigenschaften im Singular stehen sollten. (5) Obwohl die Verwendung von Zugriffsmethoden nicht erforderlich ist, wird empfohlen, Schreibzugriffsmethoden zu verwenden, um auf Eigenschaften zuzugreifen, die private Felder darstellen.