フォーミュラシンプルさの裏にある、さらなるパワー

Deeplからの自動翻訳

Formula コマンドは、 4D v17 R3 から利用できます。これまでは、数式をメソッドとしてオブジェクトに割り当てたり、値の計算や必要なことを行うことができるスマートオブジェクトを構築することを考えてきたかもしれません。これは本当に素晴らしいことで、見た目以上の効果がありますよ。

Vincent de Lachaux – Developer and expert 4D –から、このコマンドをどのように使うか、素晴らしいデモンストレーションを受けました。このブログでは、そのデモの中から、このコマンドの異なる側面についての洞察を得るために、異なるシナリオをまとめました。

例1:既存のコマンドを簡略化する

4Dコマンドの中には、コードの中で何十万回も使用されるものがあります。1つを除いて同じパラメータを渡すことがよく あります。

簡単な例として、 のコマンドを考えてみましょう。チェックボックスの値を初期化したいので、こう書きます。OBJECT get pointer

(OBJECT get pointer(Object named; "checkbox"))->:=0

あるいは、オブジェクトの名前をパラメータとする数式を書きます。

interfaceポインタ:=Formula(OBJECT Get pointer(Object named;$1))

チェックボックスの値を代入したり、取得したりするときは、次のように書けばよい。

(interface.pointer("checkbox"))->:=0
(interface.pointer("checkbox2"))->:=0

また、何千ものチェックボックスを設定する必要がある場合は、数式を作成して簡略化することができます。

interface.setCheckbox:=Formula((OBJECT Get pointer(Object named;$1))->:=$2)

一連のチェックボックスを設定するには、次のように書けばよい。

interface.setCheckbox("checkbox1";0)
interface .setCheckbox("checkbox2";1)
interface .setCheckbox("checkbox3";0)
interface .setCheckbox("チェックボックス4";1)

読みやすくなったし、括弧を数える必要がなくなったので、書くのも楽になった。

例 2 – データベースパラメーターを使用する場合

コードの中で、同じデータベース・パラメータを何度も異なる値で設定してみよう。具体的な例として、ディレイコントロールのヒントを考えてみよう。フォームのある部分ではヒントを遅延させずに表示し、別の部分では1秒待つようにしたい場合があります。データベースパラメータを使うたびに、その値を覚えておくか、別のコードでその値を探さなければなりません。

なぜ数式を作らないのでしょうか?

interface.tipsNoDelay:=Formula(SET DATABASE PARAMETER(Tips delay;1))
interface .tips1sDelay:=Formula(SET DATABASE PARAMETER(Tips delay;60))

そして、値を変えたいときは、その数式を呼び出せばいいのです。

interface.tips1sDelay()
// or

interface .tipsNoDelay()

例 3 – 数式をバリアントとして使用する

メソッドのパラメータとして渡された値(すなわち$1, $2) を使用する数式を作成できますが、数式を作成するメソッドでは $1 と $2 を入力する必要はありません。 変数は数式が実行されるときに入力されます。一般的なメソッドや数式を書くことができます。

以下は、実行時に型が定義されることを示す簡単な例です。

$obj:=New object("加算";Formula($1+$2))

$number :=$obj.addition(1;2) // 3を返す
$text :=$obj.addition("hello "; "world") // hello worldを返す

例4 – 一連の条件をテストする

If (() & ()) のような一連の条件を作ると、4Dは常にすべての条件を評価します。次の条件も評価し続けます。もし、いくつかの条件が、左端が真である場合にのみ評価される場合、属性をテストする前にオブジェクトが有効であるかどうかをチェックするために、深いネストされたif条件のリストを作成することを余儀なくされます。このような感じです。

If ( ( ( )) ( . # ) ( . <5) NotUndefined$o
If$ovalueNull
If$ovalue
// to do
End if
End if
End if

この例では、3つの条件「だけ」でしたが、だんだん複雑になっていくのがすぐわかりますね。では、すべてを1つの条件にしてみたらどうでしょう。数式を次々と実行するメソッドを書いてみてはどうでしょうか。結果がTrueなら次の式を評価し、Falseなら中止してFalseを返します。

If ( (\ ( ( ( )));\ ( . # );\ ( . <5)\ ) )_AND
FormulaNotUndefined$o
Formula$ovalueNull
Formula$ovalue
)
// to do
End if

_AND の場合は、ごく普通の簡単なコードです。

$0:=True
For ($i;1;Count parameters;1)
$0 :=${$i}.call()
If (Not($0))
$i :=MAXLONG-1// Stop if the condition fails
End if
End for

これらの例が、このコマンドの他の使用方法についてのヒントになれば幸いです。4D フォーラムであなたの数式を自由にシェアしてください…。きっとたくさんのアイディアがあるはずです。

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