4Dでメソッドチェーン
2 posters
4Dでメソッドチェーン
4DでもORDAやコレクションでjQueryのようなメソッドチェーンの記法が導入されました。
普通のメソッドでも、こんな感じの記法↓
キモは
*メソッドをフォーミュラでオブジェクトに埋め込む
*メソッドはプロジェクトメソッドで作り、必ずオブジェクトを返す。
と言う感じです。もっとスマートな方法もあるかもしれませんが、とりあえずうまく動作します。
このパターンでは、オブジェクトを参照渡ししてるので、対象となるオブジェクトは書き換えられます。
書き換えられないようにするには、受け取った$1(対象オブジェクト)をOB Copyでコピーして、それに対して処理をして、それを返すようにします。
最近はオブジェクト指向って使えないよね、なんて流れになってきてるので、この記法で、関数型プログラミングしてます的な見栄を張ってみたいだけって感じですが(^^;
一応、モナド的ななんちゃらって感じになるので、あながち間違いじゃないというかなんというか...(^^;
ーーーーーーーーーーーーーーーーーーーーーーーーーー
まずは、newでクラスメソッドを含んだオブジェクトを作成
数値_add メソッド:
数値_mul メソッド:
数値_set メソッド:
- Code:
$countries:=ds.Employee.all().distinct("address.country")
普通のメソッドでも、こんな感じの記法↓
- Code:
$d:=数値_new (0).数値_set(4).数値_add(5).数値_mul(7).数値_get() //$d=63
キモは
*メソッドをフォーミュラでオブジェクトに埋め込む
*メソッドはプロジェクトメソッドで作り、必ずオブジェクトを返す。
と言う感じです。もっとスマートな方法もあるかもしれませんが、とりあえずうまく動作します。
このパターンでは、オブジェクトを参照渡ししてるので、対象となるオブジェクトは書き換えられます。
書き換えられないようにするには、受け取った$1(対象オブジェクト)をOB Copyでコピーして、それに対して処理をして、それを返すようにします。
最近はオブジェクト指向って使えないよね、なんて流れになってきてるので、この記法で、関数型プログラミングしてます的な見栄を張ってみたいだけって感じですが(^^;
一応、モナド的ななんちゃらって感じになるので、あながち間違いじゃないというかなんというか...(^^;
ーーーーーーーーーーーーーーーーーーーーーーーーーー
まずは、newでクラスメソッドを含んだオブジェクトを作成
- Code:
//数値_new
C_REAL($1)
C_OBJECT($0)
$o:=New object("v";$1)
$env:=New object("obj";$o)
//クラスメソッド
$env.数値_set:=New formula(数値_set (This;$1)) //Thisで対象のオブジェクトをメソッドに渡す
$env.数値_get:=New formula(This.obj.v)
$env.数値_add:=New formula(数値_add (This;$1))
$env.数値_mul:=New formula(数値_mul (This;$1))
//クラスメソッド名と実際のメソッドを同じ名前にすると便利
//メソッドチェーン中でも、⌘-kでメソッドを開くことができる。
$0:=$env
数値_add メソッド:
- Code:
//数値_add
C_OBJECT($0)
C_OBJECT($1) //オブジェクトを受け取って
//実際の処理はここから
C_REAL($2)
$1.obj.v:=$1.obj.v+$2
//ここまで
$0:=$1 //オブジェクトを返す
数値_mul メソッド:
- Code:
//数値_mul
C_OBJECT($0)
C_OBJECT($1) //オブジェクトを受け取って
//実際の処理はここから
C_REAL($2)
$1.obj.v:=$1.obj.v*$2
//ここまで
$0:=$1 //オブジェクトを返す
数値_set メソッド:
- Code:
//数値_set
C_OBJECT($0)
C_OBJECT($1) //オブジェクトを受け取って
//実際の処理はここから
C_REAL($2)
$1.obj.v:=$2
//ここまで
$0:=$1 //オブジェクトを返す
矢嶋研一- 投稿数 : 13
登録日 : 2016/07/12
Re: 4Dでメソッドチェーン
実際にはあまりないと思いますが・・・
チェーンの限度は20回みたいです。
メソッド me
例:
21個目の「ばよえーん」でコンパイルエラーです。
チェーンの限度は20回みたいです。
メソッド me
- Code:
C_OBJECT($0)
$0:=This
例:
- Code:
$o:=New object("me";Formula(me ))
$o.me().me().me().me().me()\
.me().me().me().me().me()\
.me().me().me().me().me()\
.me().me().me().me().me().call()
21個目の「ばよえーん」でコンパイルエラーです。
miyako- 投稿数 : 468
登録日 : 2016/07/05
Re: 4Dでメソッドチェーン
すでにお気づきかもしれませんが,
$env.数値_add:=Formula(数値_add (This;$1))
のようにThisをパラメーターとして渡さなくても,
フォーミュラ(数値_addメソッド)自体の中でThisを使用することができ,
また$0:=$1とする代わりに,$0:=Thisと記述することができます。
Thisは,フォーミュラをメソッドとして有するオブジェクト自体($env)を指しているからです。
フォーミュラの中で,This.my_stateful_property のように値を保持することもできます。(private, publicはありませんが・・)
さらに,フォーミュラ型のオブジェクトは,他言語の「関数ポインター」のようなものですので,
Formula(数値_add (This;$1))
のように「数式」として記述するのではなく,
Formula(数値_add)
とだけ記述すればOKです。
その場合,$1はそのままメソッドに引数として渡されます。
また,前述したように,Thisはデフォルトで「親」オブジェクトですが,
JavaScriptのように,別のオブジェクトをThisにさせることもできます。
$env.数値_add.call($that;$arg1)
https://doc.4d.com/4Dv18/4D/18/Formula.301-4505749.ja.html
Thisの別な用法としては,クエリ by フォーミュラが挙げられます。
$params:=New object("args";New object("count";1))
$selection:=ds.my_table.query(Formula(This.my_related_entities.length=$1.count);$params)
$env.数値_add:=Formula(数値_add (This;$1))
のようにThisをパラメーターとして渡さなくても,
フォーミュラ(数値_addメソッド)自体の中でThisを使用することができ,
また$0:=$1とする代わりに,$0:=Thisと記述することができます。
Thisは,フォーミュラをメソッドとして有するオブジェクト自体($env)を指しているからです。
フォーミュラの中で,This.my_stateful_property のように値を保持することもできます。(private, publicはありませんが・・)
さらに,フォーミュラ型のオブジェクトは,他言語の「関数ポインター」のようなものですので,
Formula(数値_add (This;$1))
のように「数式」として記述するのではなく,
Formula(数値_add)
とだけ記述すればOKです。
その場合,$1はそのままメソッドに引数として渡されます。
また,前述したように,Thisはデフォルトで「親」オブジェクトですが,
JavaScriptのように,別のオブジェクトをThisにさせることもできます。
$env.数値_add.call($that;$arg1)
https://doc.4d.com/4Dv18/4D/18/Formula.301-4505749.ja.html
Thisの別な用法としては,クエリ by フォーミュラが挙げられます。
$params:=New object("args";New object("count";1))
$selection:=ds.my_table.query(Formula(This.my_related_entities.length=$1.count);$params)
miyako- 投稿数 : 468
登録日 : 2016/07/05
Permissions in this forum:
返信投稿: 不可
|
|