Object Pascal スタイル ガイド - Charles Calvert 著
(Object Pascal コーディング スタイル ガイド - 翻訳: Tommy Tong)
多くの実績のあるスタジオや個人が、この記事で説明したものとは異なる独自のプログラミング実践を行っていることは承知していますが、ツールを使用してコードを Borland スタイルのコードに変換し、Borland に送信することを強くお勧めします。 PROject JEDI またはその他のパブリック ソース コード リポジトリ。習慣を変えることを強制するつもりはありませんが、Borland 製品で動作するすべてのコードは、この記事で説明されている習慣に従うようにしてください。
Object Pascal は美しいデザイン言語です。可読性が高いことも利点の 1 つです。この記事で設計された標準は、Object Pascal コードの可読性を向上させます。開発者がこの記事で説明したこれらの単純な習慣に従うと、それらは標準にもなり、統一された読みやすいコーディング スタイルを使用するすべての Delphi 開発者に利益をもたらします。これらの標準を強制する取り組みは、特にメンテナンスおよびデバッグサイクルの段階で、開発者にとってソースコードの価値を高めます。
私たちはこの記事で推奨されているスタイルを信じており、賞賛していますが、それ自体は正しく、他の点では間違っているため、必ずしもそれを支持しているわけではありません。ただし、大多数の開発者が採用している標準には有効性があると信じているため、引き続きこのスタイルをサポートし、維持します。人間の脳は常に標準に適応し、見慣れたパターンを素早く整理して、その意味を迅速かつ効率的に理解できるようにする方法を見つけています。この要件により、多くの人がコードをできるだけ簡単に読めるようにするための標準が確立されます。初めて私たちのガイドラインになじみがない場合は、しばらくの間そのガイドラインに従っていただくと、慣れてくることがわかります。または、必要に応じて、独自のスタイルを維持し、標準に準拠するプログラムを通じて変換し、コードを Borland または他のリポジトリに送信することもできます。
Visual SlickEdit などの一部のテキスト エディタは、コードを特定のスタイルでフォーマットするのに役立ちます。
Egbert van Nes が開発した無料のフォーマッタは、次の場所から入手できます。
http://www.slm.wau.nl/wkao/delforexp.html
Delphi のもう 1 つの商用プログラムは CrackerJax です。
http://www.kineticsoftware.com/html/products.html
-------------------------------------------------- ----
1.0 はじめに
この記事は、Object Pascal 言語の構文規則を定義するものではありません。たとえば、else の前にシール「;」を置くことは違法です。コンパイラはこの使用を許可しません。したがって、この記事では文法規則は示しません。この記事は、言語が選択肢を提供する場合の適切な動作を定義することを目的としています。制御方法が 1 つしかない場合、私は通常沈黙します。
1.1 背景
この記事で説明するガイドラインは、Delphi ソース コードの一部に基づいています。 Delphi のソース コードは、これらのガイドラインに正確に従っています。これらの原則への違反を見つけた場合は、不確実なソース コードではなく、これらの原則をガイドラインとして使用する必要があります。ただし、少なくとも独自のコードの形式についての一般的なアイデアを得るために、これらの原則の補足として元のコードを使用できます。
1.2 ありがとう
この記事の形式は、Java 言語のスタイル標準を定義するために行われた作業に基づいています。 Java は Object Pascal ソース コードのフォーマット規則に影響を与えませんが、Sun の Web サイトにあるドキュメントがこの記事の基礎となっています。 いくつかの特別な場所で、この記事のスタイルと形式は、「Java WorkShop および Java Studio プログラミングのためのコーディング スタイル ガイド」 (Achut Reddy、「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 は長いファイル名をサポートしています。複数の単語を使用して 1 つの名前を形成する場合は、各単語の最初の大文字を使用するのが最善です (MyFile.pas)。これは括弧またはキャメルケースとみなされます。拡張子は小文字にする必要があります。歴史的な理由から、Delphi のソース コードでは 8:3 の命名パターンがよく使用されますが、開発者は上記のルールに制限される必要はなく、Delphi チームの使用法に頼る必要はありません。
C/C++ ヘッダー ファイルを翻訳する場合、翻訳する Pascal ファイルは C/C++ ヘッダー ファイルと同じメイン ファイル名を維持し、拡張子として .PAS を使用する必要があります。例: Windows.h -> Windows.pas。 Pascal 構文により、複数のヘッダー ファイルを 1 つのユニット ファイルに結合することが強制される場合、他のヘッダー ファイルを含むヘッダー ファイルのファイル名が新しいユニット ファイルの名前として使用されます。たとえば、Windows.h に WinBase.h ファイルが含まれている場合、新しいユニット ファイルの名前は Windows.pas になります。
2.2 ソースファイルの構成
すべての Object Pascal ユニット ファイルには、次の要素が次の順序で含まれている必要があります。
著作権/アイデンティティブロックのコメント
ユニット名
インターフェースセグメント
実装部分
ターミネーターの「終わり」。
各セクションの間には少なくとも 1 行の空行が必要です。
他の要素は、最も適切と思われる順序で構成する必要があります。ただし、著作権はファイルの先頭、次にユニット名、条件定義、コンパイラ ディレクティブ、または include ステートメント、そして uses 句の順に記述する必要があります。
{************************************************ * *****}
{ }
{ Borland Delphi ビジュアル コンポーネント ライブラリ }
{ }
{ Copyright (c) 1995,98 インプライズコーポレーション }
{ }
{************************************************ * *****}
ユニットボタン。
{$S-,W-,R-}
{$C プリロード}
インタフェース
用途
ウィンドウ、メッセージ、クラス、
コントロール、フォーム、グラフィックス、
StdCtrl、ExtCtrl、CommCtrl;
type セクションを const セクションの前に置くか、この 2 つを混合しても、効果はありません。
実装部分では、最初に実装を記述し、次に uses 句を記述し、次にその他の include 宣言またはその他のインジケーターを記述する必要があります。
実装
用途
Const、SysUtils、ActnList、
画像リスト;
{$R ボタン.RES}
2.2.1 著作権/アイデンティティブロックのコメント
すべてのソース ファイルは、バージョン情報と標準の著作権表示を含むブロック コメントで始まる必要があります。バージョン情報は次のようになります。
{************************************************ * *****}
{ }
{ 豊富なウィジェット }
{ }
{ Copyright (c) 1995,98 貴社 }
{ }
{************************************************ * *****}
著作権表示には少なくとも次の行が含まれている必要があります。
Copyright (C) 年 著作権所有者
Borland のソフトウェアを開発しているサードパーティの場合は、著作権の最後に自分の名前を追加できます。
{************************************************ * *****}
{ }
{ Borland Delphi ビジュアル コンポーネント ライブラリ }
{ 著作権 (c) 1995,99 ボーランド インターナショナル }
{ プロジェクト JEDI によって作成されました }
{ }
{************************************************ * *****}
2.2.2 単位宣言
各ユニット ファイルにはユニット宣言が必要です。 unit は予約語であるため、小文字にする必要があります。ユニット名は大文字と小文字を混合して使用できますが、ユニット ファイルのファイル名と同じである必要があります。例えば:
ユニットMyUnit;
この場合、ユニット ファイルの名前は MyUnit.pas になります。ファイル システムでは、このファイルのエントリとして機能します。
2.2.3 uses ステートメント
ユニット内では、use 宣言はより小さな use でブートストラップされる必要があります。参照されるユニット名は、それが独自のユニットで定義されている場合に使用される大文字化規則に従います。
MyUnit を使用します。
各ユニット名は、隣接するユニット名とカンマで区切られ、最後のユニット名の後にはセミコロンが続きます。
用途
Windows、SysUtils、クラス、グラフィックス、コントロール、フォーム、
タイプ情報;
uses の次の行からユニット名を追加することも、uses の直後にユニット名を追加することも正しいです。
Windows 、SysUtils、クラス、グラフィックス、コントロール、フォーム、
タイプ情報;
ユニット名のリストを 80 文字の制限内で折り返すように、またはユニット名ごとに 1 行にするようにフォーマットできます。
2.2.4 クラスとインターフェースの定義
クラス定義は 2 つのスペースで始まり、その後に接頭辞「T」が続きます。 接頭辞は大文字にする必要があり、埋め込まれた各単語は大文字で始まる必要があります。 Object Pascal ソース コードではタブ文字「Tab」を使用しないでください。例:
TMyClass
識別子の後にスペース、等号、単語クラスの順に続けます。単語クラスは小文字にする必要があります。
TMyClass = クラス
クラスが祖先から継承する場合は、祖先クラスを含む左括弧と右括弧を追加する必要があります。
TMyClass = クラス(TObject)
範囲インジケーターはマージンから 2 スペース離れた位置にあり、次の順序で表示されます。
TMyClass = clss(TObject)
プライベート
守る
公共
出版された
終わり;
通常、データはプライベートセクションでのみ宣言され、その識別子は「F」で始まります。このようなステートメントはすべて、余白から 4 つのスペースでなければなりません。
TMyClass =クラス(TObject)
プライベート
FMyDate: 整数;
関数GetDate: 整数;
プロシージャSetData(値: 整数);
公共
出版された
プロパティMyData: 整数 読み取り GetData 書き込み SetData;
終わり;
インターフェイスは、スコープ インジケーターとプライベート データを無視し、単語クラスの代わりに単語インターフェイスを使用する必要があることを除いて、対応するものと同じルールに従います。
命名規則
小文字の予約語と標識を除き、すべての Pascal 識別子はキャメルケース形式を使用する必要があります。つまり、各識別子の最初の文字は大文字にする必要があり、埋め込まれた単語の最初の文字も大文字にする必要があります。同様のことが略語にも当てはまります。最初の文字だけを取ります。
私の識別子
MyFTPクラス
このルールの主な例外はヘッダー ファイルの変換の場合で、元のヘッダー ファイルの命名規則に従う必要があります。例えば:
WM_LBUTTONDOWN、wm_LButtonDown とは書かないでください。
ヘッダー ファイルの翻訳を除き、単語を区切るのにアンダースコアを使用しないでください。クラス名は名詞または名詞句である必要があります。インターフェイスまたはクラスの名前は、インターフェイスの明確な目的と用途によって異なります。
良い名前:
AddressForm、ArrayIndexOutOfBoundsException
悪い名前:
ManageLayout //動詞句を使用する
delphi_is_new_to_me //下線を使用する
3.1 ユニットの命名
単位宣言を参照
3.2 クラス/インターフェースの命名
クラス/インターフェイス宣言を参照してください。
3.3 ドメイン/フィールドの命名
キャメルケース形式を使用します。大文字の「F」で始めて、パブリック アクセスを提供するプロパティまたはゲッターとセッターを使用して、すべてのデータをプライベートで宣言します。たとえば、内部フィールド/フィールド値を返す関数に名前を付けるには GetSomething という名前を使用し、フィールド/フィールド値を設定するプロシージャに名前を付けるには SetSomething を使用します。
ヘッダー ファイルの変換に必要な場合を除き、const セクションではすべて大文字を使用しないでください。
Delphi はカリフォルニアで開発されたため、ヘッダー ファイルの変換に必要な場合を除き、トークンの使用はお勧めしません。
正しい:
FMyString: 文字列;
正しくない:
lpstrMyString: 文字列;
もちろん、ハンガリー語の命名法は列挙型の定義に保持されます。
TBitBtnKind = (bkCustom、bkOK、bkCancel、bkHelp、
bkYes、bkNo、bkClose、bkAbort、bkRetry、
bkignore、bkAll);
この場合、文字 bk がこの列挙型の各要素の前に挿入されます。 bk は ButtonKind を意味します。
命名規則を検討するときは、ゼロ時間変数とループ変数を除き、単一文字の名前の使用を避けてください。
プリンターでもモニターでも「1」と区別するのが難しいため、「l」(L)変数の使用は避けてください。
3.4 メソッドの命名
メソッドの命名にもキャメルケース形式が使用されます。メソッドの命名規則は、非 const フィールドの命名規則と同じですが、コンテキストから区別できます。メソッドの名前付けでは、動詞または動詞句の使用を強制する必要があります。例えば:
//適切なメソッド名:
ShowStatus、DrawCircle、AddLayoutComponent
//メソッドの名前付けが不適切:
MouseButton //名詞句、説明機能なし
drawCircle //小文字で始める
add_layout_component //下線が使用されます
//以下のメソッドの機能は十分に明確ではありません。サービスの実行を開始しますか (より適切な: StartServer)、またはサービスが実行されているかどうかを判断しますか (より適切な: IsServerRunning)。
ServerRunning //動詞句ですがコマンドではありません
一部のクラス プロパティを取得または設定するメソッドは、それぞれ GetProperty または SetProperty と呼ばれる必要があります。Property はプロパティの名前を表します。例えば:
高さの取得、高さの設定
クラスのブール プロパティをテストするメソッドには IsVisible という名前を付ける必要があります。Visible はプロパティの名前を表します。例えば:
サイズ変更可能、可視
3.5 ローカル変数の命名
ローカル変数の命名規則は、「F」が使用されないことを除き、フィールド/フィールドの命名規則と同じです。セクション 3.3 を参照してください。
3.6 予約語
予約語とインジケーターはすべて小文字にする必要があります。これは時々少し混乱するかもしれません。例: Integer は識別子であり、最初の文字が大文字で表示されます。文字列の予約語はすべて小文字です。
3.7 型宣言
すべての型名の宣言は文字 T で始まり、クラスと同じ名前が続きます。
4.0 ホワイトスペースの使用法
4.1 空白行
空行を使用すると、論理的に関連するコード セグメントがグループ化され、読みやすくなります。空白行は次の場所でも使用できます。
著作権コメント ブロック、パッケージ宣言 (package)、およびインポート セクション (import) の後に続きます。
クラス宣言の間。
メソッド宣言の間。
4.2 スペース
Object Pascal は非常に明確で読みやすい言語です。通常、コード内の行を区切るために大量のスペースを追加する必要はありません。次の記事では、空白の使用に関するいくつかのガイドラインを提供します。
4.2.2 スペースは使用しないでください。
メソッド名と左括弧の間。
.(ドット) 演算子の前後。
単項演算子とそのオペランドの間。
型とそれがキャストする式の間。
左括弧の後と右括弧の前。
左角括弧の後と右角括弧の前。
禁止の前に。
例えば:
//正しい使い方:
関数 TMyClass.MyFunc(var 値: 整数);
MyPointer := @MyRecord;
MyClass := TMyClass(MyPointer);
MyInteger := MyIntegerArray[5];
//間違った使い方:
関数 TMyClass.MyFunc( var 値: 整数 );
MyPointer := @MyRecord;
MyClass := TMyClass (MyPointer) ;
MyInteger := MyIntegerArray [5] ;
4.3 インデント
すべてのインデント レベルを常に 2 つのスペースでインデントする必要があります。つまり、最初のレベルは 2 つのスペースでインデントされ、2 番目のレベルは 4 つのスペースでインデントされ、3 番目のレベルは 6 つのスペースでインデントされます...タブ文字 Tab は使用しないでください。
もちろん、まだいくつかの例外があります。ユニット、使用、タイプ、インターフェイス、実装、初期化、終了などの予約語は常に大文字で表記されます。セルの最終終了識別子もトップレベルです。プロジェクト ファイルでは、プログラムとメインの開始と終了も上部のグリッドに表示されます。メインの begin..end ブロックは、少なくとも 2 つのスペースでインデントする必要があります。
4.4 続き
行は 80 列に制限する必要があります。 80 列を超える行は、連続する複数の行に分割する必要があります。後続の行はすべて、この宣言の最初の行に続き、2 文字のスペースでインデントする必要があります。
例えば:
//正しい:
function CreateWindowEx(dwExStyle: DWord;
lpクラス名: PChar; lpウィンドウ名: PChar;
dwStyle: DWORD; X、Y、nWidth、nHeight: 整数;
hWndParent: HWND; hMenu: HMENU;
lpParam: ポインタ): HWND ;
if ((X = Y)または(Y = X)または
(Z = P)または(F = J)の場合
始める
S := J;
終わり;
リストがカンマで区切られていない限り、パラメーターとその型の間で行を折り返さないでください。この場合、型名が次の行から始まるように、最後のパラメーターの前で折り返されます。コロンとその変数の間にはスペースを入れてはなりません。また、コロンと型名の間にはスペースを 1 つ入れる必要があります。
//正しい:
プロシージャ Foo(Param1: 整数; Param2: 整数);
//間違い:
プロシージャ Foo( Param :Integer; Param2:Integer);
後続の行を二項演算子で始めてはなりません。メソッド名とその左括弧の間、または配列名とその左括弧の間など、通常は空白が発生しない場所で行をカットすることは避けてください。上記の状況で改行する必要がある場合は、左括弧または左角括弧の後で改行してください。 begin を他のコードと同じ行に置かないでください。
例えば:
//間違い:
while (LongExpression1 または LongExpression2) は始まります
//何かをする
//何か他のことをする;
終わり;
//正しい
while (LongExpression1 または longExpression2) は実行します
始める
//何かをする
//何か他のことをする;
終わり;
if (LongExpressiong1)または
(LongExpression2)または
(LongExpression3)その後
5.0 コメント
Object Pascal 言語は、ブロック コメントと単一行コメントの 2 種類のコメントをサポートします。注釈の使用ガイドラインをいくつか示します。
· 単元の目的を説明するコメントを単元の上部に配置すると便利です
·クラス宣言の前にコメントを置くと便利です
·メソッド宣言の前にアノテーションを設定すると便利です
・明らかな意味のコメントは避ける
i := i + 1 //i に 1 を加算します。
·誤解されやすいコメントは、まったくコメントしないよりも有害であることに注意してください。
・コメントに無効と思われる情報を記載しないでください。
·コメントの境界線にアスタリスクやその他の誤植記号を埋め込むことは避けてください。
·ゼロ時間のコメント、つまり変更または削除が必要なコメントには、見つけやすいようにコメントの前に「???:」のマークを付ける必要があります。概念的には、プログラムがリリースされる前に、ゼロタイム コメントはすべて削除されるべきです。
// ???: 修正されたときに Sort を呼び出すように変更します。
リスト.MySort;
5.1 コメントのブロック
Object Pascal は 2 種類のブロック コメントをサポートします。最も一般的に使用されるのは、中括弧 {} で囲まれたコメントです。 Delphi チームは、コメントをできるだけ少なくシンプルにしました。例: コメント内でパターンや行を作成するためにアスタリスクを使用することは避けてください。代わりに、ワープロ文書の場合と同様に、スペースを使用してコメントを区切ります。次の DsgnIntf.pas の抜粋に示すように、コメント内の単語は最初の中括弧と同じ行で始まる必要があります。
{ Tプロパティエディタ
コンポーネントのプロパティまたはコンポーネントのリストを編集します。
オブジェクト インスペクターに選択されたプロパティ。
エディタは、のタイプに基づいて作成されます。
タイプによって決定されるように編集されるプロパティ
によって登録されました...
等...
GetXxxValue
の最初のプロパティの値を取得します。
適切なプロパティを呼び出します。
TProperty GetXxxValue メソッドを取得して、
価値。
SetXxxValue すべてのプロパティの値を設定します
Properties で適切なプロパティを呼び出します。
TProperty SetXxxxValue メソッドで値を設定します。
ブロックコメントは著作権コメントでよく使用されます。コードの一部の行をコメントアウトするためにも使用されます。
メソッドの目的を説明するブロック コメントは、メソッド宣言の前に置く必要があります。
例えば:
// 正しい
{ TMyObject.MyMethod
このルーチンを使用すると、コードを実行できます。
プロシージャ TMyObject.MyMethod;
始める
終わり;
// 正しくない
プロシージャ TMyObject.MyMethod;
{************************************************ * ****
TMyObject.MyMethod
このルーチンを使用すると、コードを実行できます。
************************************************* * *****}
始める
終わり;
2 番目のタイプのブロック コメントには、括弧とアスタリスクの 2 つの文字 (* *) が含まれます。これは星括弧コメントと呼ばれることもあります。これらのアノテーションは通常、コード開発中にのみ役立ちます。その主な利点は、ネストされたアノテーションの深さを 2 レベル未満にできることです。 Object Pascal は同じタイプのコメントのネストをサポートしていないため、実際にはネストのレベルは 1 つだけです。つまり、中括弧を星形中括弧で囲むか、星形中括弧を中括弧で囲むことです。 このタイプのアノテーション内の他のタイプの標準 Pascal アノテーションは、ネストしない限り無視されます。したがって、次の構文を使用して、コードとコメントの両方を含む大きなコード ブロックをコメント アウトできます。
(* プロシージャ TForm1.Button1Click(Sender: TObject);
始める
DoThis; // プロセスを開始します。
DoThat; // 反復を継続します。
{ ここでエラーを報告する方法が必要です。おそらくこれを使用します。
最後にブロックしてみますか?
CallMoreCode; // 処理を終了します。
終わり; *)
この場合、Button1Click メソッド全体が、その中のサブコメントも含めてコメント化されます。
5.2 単一行コメント
単一行のコメントは、コメント文字 // とその先頭のテキストで構成され、テキストとコメント文字の間にはスペースが入ります。単一行のコメントがコードとは別の行にある場合は、コードと同じインデント レベルを持つ必要があります。複数の単一行コメントを使用して、大きなコメントを形成できます。
ブロックの最初の行でない限り、単一行のコメントまたはコメントのグループの前には空行が必要です。複数のステートメントにコメントが使用されている場合は、コメントとコメント グループの後に空行を置く必要があります。コメントが次の行のステートメントを説明するだけの場合は、その後に空行を置く必要はありません。
例えば:
// データベースを開きます
表1.開く。
単一行のコメントを、説明するコード宣言の後に続けることもできます。このようなコメントは、追跡コメントと呼ばれることもあります。それらとコードの間には少なくとも 1 つのスペースが必要です。複数のトレース コメントがコード ブロック内に同時に表示される場合、これらのコメントを揃える必要があります。
例えば:
if (IsVisibleではない) then
終了します。 // 何もする必要はありません。
Inc(StrLength); // NULL ターミネータ用のスペースを予約します。
実行可能コードの各行のコメントを追跡しないようにします。通常、メソッドまたは関数の begin..end ブロックの間では、コメントの使用を制限するか、コメントを空のままにすることが最善です。長いコメントは、メソッドや関数の定義の前にブロック コメントに含めることができます。
親切
6.1 クラスの編成
クラス本体の組織は次の順序に従う必要があります。
・ドメイン/フィールド宣言
・メソッド宣言
・属性定義
ドメイン/フィールド、プロパティ、メソッドには、名前のアルファベット順のインデックスが付けられている必要があります。
6.1.1 アクセスレベル
IDE によって生成されたコードを除き、クラスのスコープ指定子は次の順序である必要があります。
・プライベートステートメント
·保護ステートメント
・公式声明
・公表された声明
Object Pascal では、クラス メンバーには、アクセス能力の高い順に、公開、パブリック、保護、およびプライベートという 4 つのアクセス レベルがあります。デフォルトのアクセスレベルは公開されています。一般に、メンバーには、そのメンバーに最も適した最低のアクセス レベルを割り当てる必要があります。たとえば、同じユニット内の他のクラスからのみアクセスできるメンバーは、プライベートとして宣言する必要があります。同時に、アクセス レベルの低いメンバーを宣言すると、コンパイラーに最適化を向上させる機会も与えられます。もちろん、その一方で、低いアクセス レベルを使用すると、サブクラスの拡張が困難になります。将来のある時点でクラスがサブクラス化されると考えられる理由がある場合は、サブクラスによって継承および拡張される必要があるメンバーも、プライベート データへのアクセスに使用されるプロパティとして宣言する必要があります。
データへの一般アクセスを禁止する必要があります。通常、データはプライベート セクションで宣言され、データへのパブリック アクセスは GetXXX、SetXXX メソッドまたはプロパティを通じて行う必要があります。
6.1.8 コンストラクターの宣言
メソッドはアルファベット順のインデックスで並べ替える必要があります。コンストラクターとデストラクターをパブリック セクションの先頭に配置するか、アルファベット順に配置するのが正しい方法です。
複数のコンストラクターがある場合、または同じ名前の複数のコンストラクターを使用する場合は、パラメーター リストに従って、パラメーターが最も少ないコンストラクターがパラメーターが最も多いコンストラクターの前に配置される必要があります。これは、パラメーターのないコンストラクターがある場合、それが最初に出現する必要があることを意味します。 C++Builder との最適な互換性を維持するには、コンストラクターのパラメーター リストは一意である必要があります。 C++ は名前に基づいてコンストラクターを呼び出さないため、複数のコンストラクターを区別する唯一の方法は引数リストを使用することです。
6.2 メソッド宣言
可能であれば、メソッド宣言は 1 行で記述する必要があります。
例えば:
例:
プロシージャImageUpdate(Image img, infoflags: Integer,
x: 整数、y: 整数、w: 整数、h: 整数)
7.0 インターフェース
インターフェイス宣言の形式はクラス宣言と同じです。
InterfaceName =インターフェイス([継承されたインターフェイス])
インターフェース本体
終わり;
インターフェイス宣言は 2 つのスペースで、インターフェイス本体は 4 つのスペースで、終了文字は 2 つのスペースでインデントする必要があります。
インターフェイス宣言にはフィールドがありません。ただし、属性が現れることもあります。
すべてのインターフェイス メソッドは本質的にパブリックかつ抽象的なため、インターフェイス宣言にそのようなキーワードを含める必要はありません。
特に明記されていない限り、インターフェイス宣言は同じ型の宣言と同じスタイルを持ちます。
7.1 インターフェース本体の構成
インターフェイス本体は次の順序で編成できます。
・インターフェースメソッド宣言
・インターフェース属性宣言
インターフェイスのメソッドとプロパティは、クラスと同じスタイルで宣言されます。
8.0 ステートメント
ステートメントは、シールで終わる 1 行または複数行のコードです。単一のステートメントには禁止番号が 1 つだけあり、複合ステートメントには複数の禁止名があります。
// これは単一のステートメントです:
A := B;
//これは複合文です:
始める
B := C;
A := B;
終わり;
8.0.1 単一宣言
単一のステートメントをラップする必要がある場合は、前の行に対してスペース 2 つインデントする必要があります。
//例えば:
私の値:=
MyValue + (SomeVeryLongStatement / OtherLongStatement);
8.1.1 代入と式の宣言
1 行に最大 1 つのステートメントを含めることができます。
例えば:
a := b + c(カウント);
a := b + c;
Inc(カウント); //修正
8.1.2 ローカル変数宣言
ローカル変数もキャメルケース形式を使用します。クラス宣言内のフィールド用に予約されているリーダー「F」は使用しないでください。
例えば:
変数
MyData: 整数;
MyString:文字列;
同じ型の複数の変数を同じ行で宣言できます。
変数
配列サイズ、配列数: 整数;
この宣言の習慣はクラス宣言では推奨されません。
8.1.3 配列宣言
開き括弧の前と閉じ括弧の後に常にスペースを入れるのが一般的です。
タイプ
TMyArray = Charの配列[0..100];
8.2.3 if ステートメント
if ステートメントは少なくとも 2 行で指定する必要があります。
例えば:
//間違い:
A = Bの場合はDoSomething を実行します。
//正しい
A = Bの場合
何かをする;
複合 if ステートメントの場合は、区切り文字ごとに新しい行が必要です。
//間違い:
A = Bの場合は開始します
何かをする;
何か他のことをする;
終了、そうでない場合は開始
これを実行してください。
それをする;
終わり;
//正しい
A = Bの場合
始める
何かをする;
何か他のことをする;
終わり
それ以外
始める
これを実行してください。
それをする;
終わり;
以下のいくつかのバリエーションを採用できます。
//正しい
if条件then
始める
これを実行してください。
それ以外で終了
始める
それをする;
終わり;
//正しい
if条件then
始める
これを実行してください。
終わり
それ以外
何かをする;
//正しい
if条件then
始める
これを実行してください。
それ以外で終了
何かをしてください。
//次のメソッドは気にしないかもしれませんが、賞賛に値します。
if条件then
こうする
それ以外の場合はDoThat;
8.2.4 for ステートメント
例:
// 正しくない
for i := 0 ~ 10 が始まります
何かをする;
何か他のことをする;
終わり;
// 正しい
for i := 0 ~ 10 を実行します
始める
何かをする;
何か他のことをする;
終わり;
8.2.5 while 文
例:
// 正しくない
x < jが始まる間
何かをする;
何か他のことをする;
終わり;
// 正しい
x < jの場合
始める
何かをする;
何か他のことをする;
終わり;
8.2.6 文まで繰り返す
例:
// 正しい
繰り返す
x := j;
j := 値の更新;
j = 25まで。
8.2.7 ケースステートメント
例:
// 正しい
ケースControl.Align of
alLeft、alNone: NewRange := Max(NewRange, Position);
alRight: Inc(AlignMargin, Control.Width);
終わり;
// 正しい
ケースx
CS開始:
始める
j := 値の更新;
終わり;
csBegin: x := j;
csTimeOut:
始める
j := x;
x := 値の更新;
終わり;
終わり;
// 正しい
ケースのスクロールコード
SB_LINEUP、SB_LINEDOWN:
始める
Incr := FIncrement div FLineDiv;
FinalIncr := FIncrement mod FLineDiv;
カウント := FLineDiv;
終わり;
SB_PAGEUP、SB_PAGEDOWN:
始める
Incr := FPageIncrement;
FinalIncr := Incr mod FPageDiv;
増加 := 増加div FPageDiv;
カウント := FPageDiv;
終わり;
それ以外
カウント := 0;
増加 := 0;
最終増分 := 0;
終わり;
8.2.8 try ステートメント
//正しい
試す
試す
EnumThreadWindows(CurrentThreadID, @Disable, 0);
結果 := TaskWindowList;
を除外する
EnableTaskWindows(TaskWindowList);
上げる;
終わり;
ついに
TaskWindowList := SaveWindowList;
TaskActiveWindow := SaveActiveWindow;
終わり;
著者のブログ: http://blog.csdn.net/sailerbai/