【小技】オブジェクトのマージ

Go down

【小技】オブジェクトのマージ

投稿 by miyako on 2017-05-25, 4:53 pm

現在ベータ公開中で,リリース日が近づいている16R3の新コマンド「OB new」がなかなか好評です。
4D FORUMS http://forums.4d.fr/Post/DE/18642977/1/18642978

ブログ:http://blog.4d.com/ob-new-an-easy-way-to-initialize-an-object/

C_OBJECTは参照型なので,これまで下記のようなコードでインスタンスを作成する必要がありました。

C_OBJECT($obj)
$obj:=JSON Parse ("{}")

JSON Parseを省略した場合,メソッドのローカル変数としてはオブジェクトが使用できますが,そのオブジェクトをサブルーチンに渡した場合,受け取り側にはコピーが作られ,返り値やポインターを使用して代入しない限り,元のオブジェクトに内容を反映させることはできません。

JSON Parseを使用した場合,新しいオブジェクトのインスタンスが作られるので,そのオブジェクトをサブルーチンに渡した場合,受け取り側には「参照」が渡され,直接,同じオブジェクトを読み書きすることができます。そのようなわけで,C_OBJECTのコーディングでは,JSON Parse ("{}") を実行することが少なくありません。

OB Newを利用すれば,新しいオブジェクトのインスタンスを明示的に作成することができます。

C_OBJECT($obj)
$obj:=OB New

加えて,初期プロパティを引数で設定することもできます。

C_OBJECT($obj)
$obj:=OB New("foo";"bar")

プロパティはオブジェクトであっても構いません。

$obj1:=OB New("foo";"bar")
$obj2:=OB New("foo2";"bar2";"foo3";$obj1)

ところで

既存のオブジェクトを「合成」して新しいオブジェクトを作成したい,というご要望がありました。

たとえば,オブジェクト型のパラメーターを受け取るようなメソッドで,特に指定がなかった場合はデフォルトのオブジェクトを使用し,指定があった場合には,その部分のみ,パラメーターを上書きするような使い方をイメージしています。

フィーチャーリクエストURL
http://forums.4d.fr/Post//19466427/1/

もっとも,下記のようなメソッドを記述すれば,既存のコマンドで同等のことができます。

Code:
C_OBJECT(${1})
C_OBJECT($0)

If (Count parameters#0)

$dst:=OB Copy($1)

For ($i;2;Count parameters)

$src:=${$i}

OB GET PROPERTY NAMES($src;$names;$types)

For ($j;1;Size of array($names))
OB SET($dst;$names{$j};OB Get($src;$names{$j};$types{$j}))
End for

End for

$0:=$dst

End if

miyako

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

トップに戻る Go down

トップに戻る


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