渡されなかった引数にアクセスすることは……可能です!

メソッドや関数は、任意パラメーターを持つことができます。関数が引数 2つで呼び出されることもあれば、3つで呼び出されることもあります。引数を数えたり、そもそも渡されたかどうかをチェックしたり、あるいは単に引数に関連する変数が初期化されているかどうかをチェックすることなく、引数にアクセスすることを誰もが夢見たことがあるでしょう。そうすれば、”If” や “Count parameters” などが不要になり、コードがよりシンプルに、より読みやすくなるはずです。

その夢が実現した、4D v19 R3 に乗り換えましょう! メソッドや関数のパラメーター管理は、かつてないほど簡単になりました。

引数へのアクセス

関数やメソッドのプロトタイプで宣言したパラメーターは、呼び出し時に引数が渡されなかった場合には、デフォルト値で初期化されるようになりました。コンパイルモードでも、このためのランタイムエラーは発生しなくなりました。このドキュメントのページでは、変数のデータ型に対するデフォルト値の表が確認できます。

次の例では、関数が $param1 と $param2 パラメーターをチェックなしで使用しています。もし、この関数を呼び出す際に、$param1 や  $param2 のパラメーターが渡されなかった場合、4D はこれらのテキスト変数を空文字列に初期化します:

// "concate" クラス関数
Function concate ($param1 : Text ; $param2 : Text)
 Alert($param1+" "+$param2)

// "method1" メソッド
$class.concate("Hello";" world") // 表示: "Hello world"
$class.concate("Hello") // 表示: "Hello "
$class.concate() // 表示: " "

ただし、注意が必要です。4D が変数を初期化するには、その型を知っている必要があります。もし、${i} という記法を使い、引数を渡しても宣言してもいない場合、コンパイルモードで実行すると必ずエラーになります。

パラメーターの初期化

引数が渡されない場合、その関連する変数は空の値 (デフォルト値) で初期化されることを見てきました。そこで、今度は Chooseコマンドを使って、引数が渡されなかった場合に値を直接定義することができます。

以下は、サンプルメソッドと #DECLARE命令を使用した例です:

// "myAlert" メソッド
#DECLARE($param1 : Text ; $param2 : Text)
$param1:=Choose(Count parameters>=1 ; $param1 ; "Hello")
$param2:=Choose(Count parameters>=2 ; $param2 ; "world")
Alert($param1+" "+$param2)

// "method1" メソッド
myAlert() // 表示: "Hello world"

コンポーネントの場合は

この簡素化の恩恵を受けるには、呼び出されるメソッドと呼び出すメソッドを再コンパイルする必要があります。つまり、ホストベースとコンポーネントで共有されるメソッドの場合、両方のプロジェクトを再コンパイルする必要があります。

でも、ソースを持っていないコンパイル済みのコンポーネントはどうなるのでしょうか? ご心配なく、これらは今まで通りに使えます。コードを変更する必要はありません。

次は?

この新機能は、メソッドや関数の使い方にたくさんのアイデアを与えてくれます。フォーラムであなたのヒントを自由にシェアしてください。

Vanessa Talbot
- プロダクトオーナー - Vanessa Talbotは、2014年6月に4Dプログラムチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。入社以来、4Dにおける主要機能の定義に関わってきました。プリエンプティブ/マルチスレッドの新機能の大部分と、非常に複雑なテーマである組み込みアプリケーションの新アーキテクチャに取り組んできました。VanessaはTelecom Saint-Etienneで学位を取得後、Criminal Research Institute でオーディオビジュアル部門の開発者としてキャリアをスタートさせました。また、メディアや医療の分野でも、技術サポートやプロダクションの分野で働いてきました。