メソッド
メソッドとは、1つ以上の動作を実行するコードのことです。 メソッドは、一つ以上のステートメントで構成されます。ステートメントとは、メソッドの1行のことで1つの命令を実行します。 ステートメントは 1つの命令を実行し、単純な場合もあれば複雑な場合もあります。 各ステートメントは常に 1行ですが最大 32,000文字まで使用することができます。
メソッドは最大 2GBのテキストまたは、32000行まで記述できます。
メソッドタイプ
4D ランゲージにおいて、数種類のメソッドが存在します。 その呼び出し方によって、メソッドは区別されます:
型 | 自動呼び出しのコンテキスト | 引数の受け取り | 説明 |
---|---|---|---|
プロジェクトメソッド | 呼び出しに応じて (プロジェクトメソッドの呼び出し 参照) | ◯ | 任意のアクションを実行するためのコードです。 作成されたプロジェクトメソッドは、そのプロジェクトのランゲージの一部となります。 |
オブジェクト (ウィジェット) メソッド | メソッドが設定されたフォームオブジェクトに関連したイベント発生時に | × | フォームオブジェクト (ウィジェットとも呼びます) のプロパティです。 |
フォームメソッド | メソッドが設定されたフォームに関連したイベント発生時に | × | フォームのプロパティです。 フォームメソッドを使用してデータとオブジェクトを管理することができます。ただし、これら目的には、オブジェクトメソッドを使用する方が通常は簡単であり、より効果的です。 |
トリガー (別名 テーブルメソッド) | テーブルのレコード操作 (追加・削除・修正) の度に | × | テーブルのプロパティです。 トリガーは、データベースのレコードに対して「不正な」操作がおこなわれることを防ぎます。 |
データベースメソッド | 作業セッションのイベント発生時に | ○ (既定) | 4D に は 16のデータベースメソッドがあります。 詳細はデータベースメソッドの項を参照ください。 |
4D ランゲージは クラス関数 もサポートしています。クラス関数は、オブジェクトインスタンスのコンテキストにおいて呼び出されます。 クラス関数にはビルトインのものと (*例: *
collection.orderBy()
やentity.save()
)、開発者によって作成されるものがあります。
プロジェクトメソッドの呼び出し
その実行方法や使用方法に応じて、プロジェクトメソッドは次のような役割を果たします:
- サブルーチン
- オブジェクトフォーミュラ
- メニューメソッド
- プロセスメソッド
- イベントまたはエラー処理メソッド
サブルーチン
サブルーチンは、処理の下請け的なプロジェクトメソッドです。 他のメソッドから呼ばれて、要求された処理を実行します。 関数は、呼び出し元のメソッドに値を返すサブルーチンのことです。
プロジェクトメソッドを作成すると、それは同データベースのランゲージの一部となります。 プロジェクトメソッドは、4Dのビルトインコマンドと同様に、ほかのメソッド (プロジェクトメソッドやオブジェクトメソッド) から呼び出すことができます。 このように使用されるプロジェクトメソッドをサブルーチンと呼びます。
サブルーチンは、以下のような目的で使います:
- 重複コードの削減
- メソッドの役割の明確化
- メソッド改変の容易化
- コードのモジュール化
たとえば、顧客データベースがあるとします。 プロジェクトをカスタマイズしていくうちに、顧客を検索してレコードを修正するという一連の作業を繰り返しおこなっていることに気づいたとします。 そのコーディングは以下のようになっています:
// 顧客を検索します
QUERY BY EXAMPLE([Customers])
// 入力フォームを選択します
FORM SET INPUT([Customers];"Data Entry")
// 顧客レコードを修正します
MODIFY RECORD([Customers])
サブルーチンを使用しなければ、顧客レコード修正のたびにコードを作成しなければなりません。 プロジェクトの 10箇所で同じ処理が必要であれば、同じコーディングを 10回も書かねばなりません。 サブルーチンを使用すれば 1回コーディングするだけですみます。 これがコーディングの重複を減らすというサブルーチンの第一の利点です。
先ほど説明したコードが MODIFY_CUSTOMER
と呼ばれるメソッドであるとすれば、他のメソッド内でそのメソッド名を使うことで実行できます。 たとえば、顧客のレコードを修正し、それからレコードをプリントするために、以下のようなメソッドを書くことができます:
MODIFY_CUSTOMER
PRINT SELECTION([Customers])