4D-JUG
Would you like to react to this message? Create an account in a few clicks or log in to continue.

4Dでメソッドチェーン

2 posters

Go down

4Dでメソッドチェーン Empty 4Dでメソッドチェーン

投稿 by 矢嶋研一 2019-10-16, 12:57 pm

4DでもORDAやコレクションでjQueryのようなメソッドチェーンの記法が導入されました。
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

トップに戻る Go down

4Dでメソッドチェーン Empty Re: 4Dでメソッドチェーン

投稿 by miyako 2020-01-23, 11:53 pm

実際にはあまりないと思いますが・・・

チェーンの限度は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

投稿数 : 480
登録日 : 2016/07/05

トップに戻る Go down

4Dでメソッドチェーン Empty Re: 4Dでメソッドチェーン

投稿 by miyako 2020-01-24, 10:28 am

すでにお気づきかもしれませんが,

$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

投稿数 : 480
登録日 : 2016/07/05

トップに戻る Go down

4Dでメソッドチェーン Empty Re: 4Dでメソッドチェーン

投稿 by Sponsored content


Sponsored content


トップに戻る Go down

トップに戻る


 
Permissions in this forum:
返信投稿: 不可