オブジェクトとコレクションの簡単な参照比較

オブジェクトは4DランゲージとQodlyにとって不可欠なものとなりました。

しかし、このタイプの変数を宣言するときは、実際には参照を定義していることになります。では、2つのオブジェクトが実際には1つで、同じ参照を共有しているかどうかを知るにはどうすればいいのでしょうか?

4D 20 R6から、オブジェクト参照の比較はシンプルになりました。それには、= と # 演算子を使うだけです!

このブログ記事では、これらの演算子と、オブジェクトが同じ参照を共有しているかどうかを判断する方法について説明していきます。詳しく見ていきましょう!

等しいか、異なるか…それが問題だ

オブジェクトについて話すとき、その内容参照 を区別することが重要です。等号(=)や不統合(#)を使った比較や、他にも配列中の検索やカウントなどは、参照に関係するものです。

コレクションも同様です。コレクションが変数として宣言されるとき、実際に宣言されるのは参照です。以下の例はこのことを明確にするのに役立つだろう。

例1: 2つのオブジェクトが宣言され、同じ参照を共有する場合:
var $o1; $o2 : Object
$o1:={a: 1}
$o2:=$o1  // 同じ参照、 $o2 は単なる $o1 のコピーではない

$result:=($o1=$o2)  // True
$result:=($o1#$o2)  // False
例2:2つのコレクションが宣言され、同じ参照を共有する場合:
var $c1; $c2 : Collection
$c1:=["a"]
$c2:=$c1   // 同じ参照、$c2 は単なる $c1 のコピーではない

$result:=($c1=$c2)  // True
$result:=($c1#$c2)  // False
例3:今度は2つのオブジェクトと2つのコレクションがそれ同じ内容を持ちます。どちらの場合も、実際には2つの異なるオブジェクトと2つの異なるコレクションなのです:
$o1:={a: 1}
$o2={a: 1}
$result:=($o1=$o2)  // False (異なるオブジェクトと判定されます!)
$result:=($o1#$o2)  // True

$c1:=["a"]
$c2:=["a"]
$result:=($c1=$c2)  // False (異なるコレクションと判定されます!)
$result:=($c1#$c2)  // True

配列と配列関数

Find in array そしてCount in array

これまで、Find in arrayCount in array のような関数は、オブジェクト配列では使えませんでした。しかし、今後は使えるようになりました

$o1:={a: 1}
$objects{20}:=$o1
$position:=Find in array($objects; $o1)  // 20を返します !
$o1:={a: 1}
$objects{10}:=$o1
$objects{20}:=$o1
$objects{30}:=$o1

$count:=Count in array($objects; $o1) // -> 3を返す

SORT ARRAY、Find in sorted array、Multisort Array コマンド

オブジェクト配列に多くの要素が含まれ、それらがソートされている場合、Find in array よりも、Find in sorted array コマンドの方がはるかに高速です。そのため、SORT ARRAY コマンドもオブジェクトをソートできるように改良しました!ソート順序は純粋に技術的/内部的な順序ですが、対で使用されるFind in sorted array コマンドを後で使用できるようにするためにはこの改良は不可欠です。

コレクション内のオブジェクトとコレクション

query()関数は、コレクション内のオブジェクトやコレクション参照の検索にも使用できます!

以下のコード例は今後は有効なコードとなります。

コレクション内のオブジェクトの例

$o1:={a: 1}
$c1:=[{o: $o1}]
$c2:=$c1.query("o = :v"; {parameters: {v: $o1}})

コレクションの中にコレクションがある例

$col1:=[1; 2; 3]
$c1:=[{c: $col1}]
$c2:=$c1.query("c = :v"; {parameters: {v: $col1}})

エンティティとエンティティセレクション

ORDAの原則によれば、同じことがエンティティとエンティティ選択にも当てはまります。あるエンティティがあるレコードを参照しているとき、別のエンティティが同じレコードを参照していてもそれらは異なるもの(等しくない)と判定されます。

$e1:=ds.Table.all().first()
$e2:=$e1
$result:=($e1=$e2) // True

$e1:=ds.Table.all().first()
$e2:=ds.Table.all().first()
$result:=($e1=$e2) // False

2つのエンティティセレクションの場合も同様です。こちらの方が理解しやすいかもしれません。2つ目のケースでは、$es1と$es2が作成されるまでの時間経過の間に、テーブルの内容が変更されている可能性があります。しかし、そうでなくても、$es1と$es2は常に異なるエンティティセレクションであると判定されます!

$es1:=ds.T1.all()
$es2:=$es1
$result:=($es1=$es2) // True

$es1:=ds.T1.all()
$es2:=ds.T1.all()
$result:=($es1=$es2) // False

結論

文字列、数値、日付、時刻の場合と同じように、オブジェクトを比較 したり検索 したりできるようになりました。他の変数型に準拠するためのこれらの変更によって、あなたの開発がより簡単になることを願っています。

フォーラムでご意見をお聞かせください!

Roland Lannuzel
- プロダクトオーナー&4Dエキスパート -電子工学を学んだ後、産業用ITの分野で開発者兼コンサルタントとして、さまざまなデータベースやテクノロジーを使って顧客のためのソリューションを構築。80年代後半に4Dに惚れ込み、会計、請求書作成、メールシステムなどのビジネスアプリケーションの作成に4Dを使用してきました。現在も、新機能やデータベース開発ツールの定義など、4Dの未来を積極的に切り開いています。