手続きと関数 1. 命名と形式 (1) 手続き名は大文字で始まり、読みやすくするために大文字と小文字をずらす必要があります。次の記述方法は間違っています: PRocedure thisisapoorlyformattedroutinename; これを次のように変更します:procedure ThisIsMuchMoreReadableRoutineName; (2) プロセス名は意味のあるものである必要があります。アクションを実行するルーチンには、そのアクションを表す動詞を名前の前に付けるのが最適です。例: プロシージャ FormatHardDrive; 入力パラメータ値を設定するルーチン名には、前に Set を付ける必要があります。例: プロシージャ SetUserName; 値を取得するルーチン名には、前に Get を付ける必要があります。例: function GetUserName: string;仮パラメータ ( 1) 形式: 可能な限り、同じタイプの仮パラメータはグループ化する必要があります。例:procedure ProcedureName (Param1, Param2, Param3: Integer; Param4: string); (2) 名前付け: すべての仮パラメータの名前は、その目的を表す必要があります。必要に応じて、正式なパラメータ名には先頭に文字 A を付ける必要があります。例:procedure ProcedureName (AUserName: string; AUserAge: integer); パラメータ名がクラス属性またはフィールドと同じ名前である場合、接頭辞 A が必要です。 (3) パラメータの順序: 仮パラメータの順序は主にレジスタ呼び出し規則に依存します。最も一般的に使用されるパラメータは、使用頻度の順に左から右に並べた最初のパラメータです。入力パラメータは出力パラメータよりも前に置かれます。範囲が広いパラメータは、範囲が狭いパラメータの前に配置する必要があります。例: プロシージャ ProcedureName (APlanet、AContinent、A Country、AState、ACity) 一部は例外です。例: イベント処理中、TObject 型の Sender パラメータが最初に渡されるパラメータとなることがよくあります。 (4) 定数パラメータ: レコード、配列、短い文字列、またはインターフェイス型のパラメータがルーチンによって変更されないようにするには、仮パラメータを Const としてマークする必要があります。このようにして、コンパイラーは最も効率的な方法でコードを生成し、渡されたパラメーターが不変であることを保証します。他のタイプのパラメータがルーチンによって変更されることが予想されない場合、それらのパラメータに C onst のマークを付けることもできます。これは効率には影響しませんが、ルーチンの呼び出し元により多くの情報が与えられます。 (5) 名前の競合: 2 つのユニットに同じ名前のルーチンが含まれている場合、そのルーチンが呼び出される場合、実際には Uses 句の後ろにあるユニット内のルーチンが呼び出されます。この状況を回避するには、メソッド名の前に目的のユニット名を追加します (例: SysUtils.FindClose (SR);Windows.FindClose(Handle);3)。変数 (1) 変数の名前と形式: 変数の名前は、その目的を表現できるものでなければなりません。ループ制御変数は、多くの場合、I、J、K などの 1 文字です。 UserIndex など、より意味のある名前を使用することもできます。ブール変数名は、True 値と False 値の意味を明確に示す必要があります。 (2) ローカル変数: ローカル変数はルーチン内で使用され、他の変数の命名規則に従います。必要に応じて、ルーチンの開始時に変数をただちに初期化する必要があります。ローカル AnsiString 型変数は自動的に空の文字列に初期化され、ローカル インターフェイスおよびディスパッチ インターフェイス型変数は自動的に nil に初期化され、ローカル Variant 型および OleVariant 型変数は自動的に Unassigned に初期化されます。 (3) グローバル変数: グローバル変数の使用は一般に推奨されません。ただし、それが必要な場合もあります。それでも、グローバル変数は必要な環境に限定する必要があります。グローバル変数は、ユニットの実装部分でのみグローバルにすることができます。グローバル データは、多くのユニットで使用される場合は、共通のユニットに移動して、宣言時にすべてのオブジェクトで使用できるようにする必要があります。 。 (すべてのグローバル変数は自動的にゼロで初期化されるため、グローバル変数を 0、nil、または Unassigned などのヌル値に初期化しないでください。ゼロで初期化されたグローバル変数は、.EXE ファイル内でスペースを占有しません。ゼロで初期化されるデータは仮想データ セグメントに保存されます。仮想データ セグメントは、アプリケーションの起動時にのみメモリを割り当てます。EXE ファイル内のスペースを占有します。 Type(1) 大文字と小文字の規則: 型識別子は予約語であり、すべて小文字である必要があります。 Win32 API タイプは多くの場合すべて大文字で、Windows.pas やその他の API ユニットなどの特定のタイプ名のルールに従います。他の変数名の場合は、最初の文字を大文字にし、他の文字を大文字と小文字を交互に使用する必要があります。例: varMyString: string; // 予約語 WindowsHandle: HWND; // Win32 API タイプ I: Integer; // システム ユニットで導入された型識別子 (2) 浮動小数点型: 実数型の使用は推奨されません。古い Pascal コードとの互換性のために予約されています。通常、浮動小数点数には Double を使用する必要があります。 Double はプロセッサによって最適化でき、IEEE によって定義された標準データ形式です。 Extend は、Double よりも広い範囲が必要な場合に使用できます。 Extend は Intel 固有のタイプであり、Java ではサポートされていません。浮動小数点変数の物理バイト数が重要な場合 (おそらく、DLL を作成するために別の言語を使用する場合)、Single を使用する必要があります。 (3) 列挙型: 列挙型名は列挙の目的を表す必要があります。これがデータ型であることを示すために、名前の前に文字 T を付ける必要があります。列挙型の識別子リストのプレフィックスには、相互に関連付けるために 2 ~ 3 個の小文字が含まれている必要があります。例: TSongType = (stRock, stClassical, st Country, stAlternative, stHeavyMetal, stRB); 列挙型の変数インスタンスの名前は型と同じですが、接頭辞 T が付きません。変数にさらに多くの名前を付けることもできます。 FavoriteSongTpe1、FavoriteSongTpe2 などの特別な名前を指定する場合はお待ちください。 (4)Variant と OleVariant: 通常、Variant と OleVariant の使用は推奨されません。ただし、データ型が実行時のみに分かる場合 (COM やデータベース アプリケーションの場合が多い)、プログラミングにはこれら 2 つの型が必要です。 ActiveX コントロールの自動化などの COM プログラミングを行う場合は OleVariant を使用し、非 COM プログラミングの場合は Variant を使用する必要があります。これは、Variant が Delphi のネイティブ文字列を効果的に保存できるのに対し、OleVariant は参照カウントなしですべての文字列を OLE 文字列 (つまり Wide Char 文字列) に変換するためです。 5.構築型 (1) 配列型: 配列型名は配列の目的を表す必要があります。型名には先頭に文字 T を付ける必要があります。配列型へのポインターを宣言する場合は、配列型の先頭に文字 P を付けて、型宣言の前に宣言する必要があります。例: typePCycleArray = ^TCycleArray; TCycleArray=array [1..100] of integer; 実際、配列型の変数インスタンスの名前は型と同じですが、接頭辞 T が付きません。 (2) レコードタイプ: レコードタイプ名は、レコードの目的を表す必要があります。型名には先頭に文字 T を付ける必要があります。レコード型へのポインターを宣言する場合は、先頭に文字 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 Name: string read GetName write SetName;end;(4) Property プロパティはプライベート フィールドへのアクセサーとして機能し、以下に続きます。同じ フィールドには同じ命名規則がありますが、F 接頭辞がありません。プロパティ名は動詞ではなく名詞である必要があります。プロパティはデータであり、メソッドはアクションです。配列プロパティ名は複数形にする必要がありますが、一般プロパティは単数形にする必要があります。 (5) アクセス メソッドの使用は必須ではありませんが、プライベート フィールドを表すプロパティにアクセスするには書き込みアクセス メソッドを使用することをお勧めします。