オブジェクトを共有オブジェクトに入れようとしたときに、「Not supported value type in a shared object」というエラーが何回出たでしょうか?
あなたはどうしましたか?無実のオブジェクトを共有オブジェクトにするために長いコードを書き、おそらくそのすべてのプロパティを繰り返し処理しましたか?
共有オブジェクトをある共有グループから別の共有グループに転送するのはどうでしょうか?
オブジェクトの面白いところは、ハッシュマップ(キー/バリューシステム)として使えることはすでにご存知でしょう。しかし、1行のコードですべてのキーやすべてのバリューを取得するのはどうでしょうか?
4D v18 R3がリリースされ、良いニュースがもたらされましたので、読み進めてください。
共有オブジェクトとコレクションのCOPY
オブジェクトを共有としてコピーする
また OB Copy()コマンドが改良され、新しいオプションとしてck shared を指定できるようになりました。
以下の例では、$person オブジェクトが共有オブジェクトとして$copy オブジェクトにコピーされています。
そして、$copy オブジェクトを$personsList 共有オブジェクトの中に入れることができます。
C_OBJECT
$personsList
$copy ($person;$copy;$personsList)
C_TEXT ($text)
$text :=Document to text(Get 4D folder(Current resources folder)+"person.txt")
//$person is a standard object $person :=JSON Parse($text)
:=New shared object()//$copy is a shared object
$copy :=OB Copy($person;ck shared)
Use ($personsList)//We can put $copy in $personsList because $copy is a shared object
$personsList ...person:= xml-ph-003
End use
ある共有グループの共有オブジェクトを別の共有グループに割り当てる
コマンドの機能が強化され、新しいパラメータ OB Copy()コマンドは、新しいパラメータgroupWith(これは共有オブジェクトまたは共有コレクションでなければなりません) を受け付けるように改良されました。
groupWithパラメータを渡すと、 コピーしたオブジェクトをgroupWithと同じ共有グルー プに入れることができます。
下の例では、$sharedObj と$sharedColl は、2つの別々の共有グループに属しています。
$sharedObj を$sharedColl に入れるとエラーが出ますが、$sharedObj を$sharedColl と同じ共有グループに属する新しいオブジェクトに簡単にコピーすることができます .
C_OBJECT
$sharedCollNew shared collection
//$objCopy is in the same shared group as $sharedColl$objCopy($sharedObj;$objCopy)
C_COLLECTION ($sharedColl)
//$sharedObj belongs to a shared group $sharedObj :=New shared object("lastname"; "Smith"; "address";New shared object("city"; "New York")
//$sharedColl belongs to another shared group
:=New shared object("lastname"; "Brown")
:=OB Copy($sharedObj;ck shared;$sharedColl)
//So we can put $objCopy into $sharedColl without error
Use ($sharedColl)
$sharedColl .
push($objCopy)
End use
また、共有コレクションについてはどうでしょうか。
上記の例は OB Copy()コマンドに関連するものです。
collection.copy()のメンバーメソッドも全く同じように強化されています。
オブジェクトをハッシュマップとして扱う
オブジェクトをハッシュマップとして扱うことを容易にする新しいコマンドがあります。プロパティ名に動的なデータを含むオブジェクトがある場合、これらのコマンドはあなたのためのものです。
一つの例で説明しましょう。
プロパティ名としてfirstnames、プロパティ値としてageを含む$persons オブジェクトを考えてみましょう。
C_OBJECT // Mary is 30($persons)
$persons :=New object
$persons ["John"]:=42// John is 42
$persons ["Andy"]:=24// Andy is 24
$persons ["Mary"]:=30
$persons ["Paul"]:=50// Paul is 50
$persons ["Fred"]:=51// Fred is 51
OB Keysコマンド
このコマンドは、あるオブジェクトのプロパティ名をコレクションとして返す。
ALERT("There are "+String(OB Keys($persons).length)+" 人")
OB Values コマンド
このコマンドは、オブジェクトのプロパティ値をコレクションとして返す。
ALERT("The age average is "+String(OB Values($persons).average()))
OB Entriesコマンド
このコマンドは、キーとなるプロパティ(プロパティ名)と値(プロパティ値)を持つオブジェクトのコレクションを返します。
C_COLLECTION($agesOK)
$agesOK:=OB Entries($persons).query("value>:1";45)
ALERT ("There are "+String($agesOK.length)+" persons who are over 45")
ALERT ("Their names are:"+$agesOK.extract("キー").join("-"))
このようにオブジェクトを使うと、インデックスを使うときと同じように、データに素早く直接アクセスできるようになります。
firstnameとageのプロパティを持つオブジェクトのコレクションを使うよりも高速です。
また、それらのコマンドは、コレクションを返すことに注意してください。これにより、コレクションで利用可能なすべてのメンバーメソッド(例えば average(), query(), …).