変数の宣言とフィールドの宣言の概要(Delphi)
リファクタリング機能を使用して、変数やフィールドを作成できます。 この機能を利用すると、事前に計画していなくてもコーディング中に、変数やフィールドを作成して宣言できます。 このトピックでは、次の情報について説明します。
変数の宣言 - Shift+Ctrl+V
手続きブロックのスコープ内に、未宣言の識別子が存在する場合は、変数を作成できます。 この機能を利用すると、未宣言の識別子を選択し、簡単なメニュー選択またはキーボード ショートカットを利用して、新規の変数宣言を作成できます。 [変数の宣言]ダイアログを起動すると、このダイアログには、選択されている識別子に応じて、お勧めの変数名が表示されます。 この変数に別の名前を付ける選択をした場合は、変数は正常に作成されますが、未宣言の識別子シンボル(エラー インサイトの下線付き)はそのまま残ります。
変数名は、識別子用の言語規則に従う必要があります。 Delphi では、変数名は次の規則に従う必要があります。
- キーワードと同じではいけない。
- スペースを含んではいけない。
- 予約語(if、begin など)と同じではいけない。
- Unicode のアルファベット文字またはアンダースコアで始まらなければならない。ただし、変数名の内部には、Unicode の英数字やアンダースコアを含めることができる。
- Delphi 言語では、型名をキーワード string にすることもできます。
メモ: 変数の宣言を選択したときに表示されるダイアログでは、その変数の初期値を設定するかどうかを指定できます。
初期の型の提示
リファクタリング エンジンは、これから作成しようとする変数の型を提案します。 リファクタリング エンジンは、選択されているステートメントの 2 項演算を評価して、子オペランドの合計の型を、新規変数の型として使用します。 たとえば、次のコードを考えます。
myVar := x + 1;
リファクタリング エンジンは、与えられた x が Integer なので、新規変数 myVar を Integer 型に設定するものと自動的に仮定します。
通常、リファクタリング エンジンは、ステートメントを評価することによって、型を推測できます。 たとえば、If foo Then...
ステートメントは、foo が Boolean であることを暗黙のうちに示しています。 If (foo = 5) Then...
の例では、式の結果は Boolean になります。 それにもかかわらず、この式は、序数(5)と未知の型(foo)の比較です。 この 2 項演算は、foo が序数でなければならないことを示しています。
フィールドの宣言 - Shift+Ctrl+D
クラスのスコープ内に、未宣言の識別子が存在する場合は、フィールドを宣言できます。 [変数の宣言...]機能と同様に、コード内に作成したフィールドをリファクタリングできます。リファクタリング エンジンは、フィールドの宣言を適切な場所に作成します。 この操作を正常に実行するには、そのフィールドが、親となるクラスのスコープ内に存在していなければなりません。 これを実現するには、そのクラス自体の内部にフィールドをコーディングするか、フィールド名の前にオブジェクト名(そのフィールドのコンテキストを提供する)を付加する必要があります。
フィールドを宣言する際のルールは、変数を宣言する際のルールと同じです。
- キーワードと同じではいけない。
- スペースを含んではいけない。
- 予約語(if、begin など)と同じではいけない。
- Unicode のアルファベット文字またはアンダースコアで始まらなければならない。ただし、フィールド名の内部には、Unicode の英数字やアンダースコアを含めることができる。
- Delphi 言語では、型名をキーワード string にすることもできます。
メモ: .NET では、アンダースコアで始まる識別子は、システム用に予約されています。
フィールドの可視性を選択できます。 private または strict private 以外の可視性を選択した場合、リファクタリング エンジンは、次の操作を実行します。
- 子クラスをすべて検索する。
- 各子クラスのフィールド名を検索する。
- フィールド名が、子孫クラスのフィールド名と衝突する場合は、赤いエラー項目を表示する。
- フィールド名が、既存の項目名と衝突する場合は、リファクタリングは適用できない。
リファクタリング サンプル
次の例は、リファクタリング機能を使用して、変数とフィールドの宣言を行う様子を示しています。
以下のコードについて考えてみましょう。
TFoo = class private procedure Foo1; end; ... implementation procedure TFoo.Foo1; begin FTestString := 'test'; // refactor TestString, assign field end;
[フィールドの宣言...]リファクタリングを適用すると、 結果は次のようになります。
TFoo = class private FTestString: string; procedure Foo1; end;
代わりに、[変数の宣言...]リファクタリングを適用すると、結果は次のようになります。
procedure TFoo.Foo1; var // added by refactor TestString: string; // added by refactor begin TestString := 'test'; // added by refactor TestString := 'whatever'; end;