ストッププレス!渡されないパラメータにアクセスすることは……可能です

Deeplからの自動翻訳

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

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

パラメータへのアクセス

関数やメソッドのプロトタイプで宣言したパラメータは、呼び出し中にパラメータが渡されないと、変数に空の値がインスタンス化されます。コンパイルモードでも、このための実行時エラーは発生しなくなりました。このドキュメントのページでは、変数の種類ごとに対応表が用意されていますね。

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

// "concate" function class
Function concate ( : ; : ) ( +" "+ ) $param1 Text $param2 Text
Alert$param1$param2

// "method1" method
$class.("Hello";" world") .("こんにちは") concate // Display: "Hello world"
$classconcate // Display: "Hello "

.
$classconcate()// Display: " "

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

パラメータの初期化

パラメータが渡されない場合、その関連する変数は空の値でインスタンス化されることを見てきました。そこで、今度は Chooseコマンドを使用して、パラメータが渡されない場合に値を直接定義することができます。

以下は、あるメソッドと #DECLARE命令を使用した例です。

// "myAlert" method
#DECLARE$param2( : ; : ) := ( >=1 ; ; "Hello") := ( >=2 ; ; "world") ( +" "+ ) $param1 Text $param2 Text
$param1ChooseCount parameters $param1
ChooseCount parameters $param2
Alert$param1$param2

// "method1" method
myAlert
() // Display: "Hello world"

コンポーネントについてはどうだろうか?

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

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

次はどうする?

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

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