4Dランゲージはクラスの概念を、ひいては コンストラクターの概念をサポートしています。
他方、ORDA の抽象化レイヤーは、データモデルクラスを通して、大きなビジネス上の利点を提供しています。ビジネス指向のコードを書き、それを API のように “公開” することができます。データストア、データクラス、エンティティセレクション、エンティティはすべて、関数や計算属性、エイリアス属性を持てるクラスオブジェクトとして利用できます。
これにより、アプリは強力かつ最適化されたコードで、MVCの原則に簡単に従うことができます。
4D 20 R10 より、完全なオブジェクト指向のアプローチで作業するため、Entity クラスに constructor() を設定できるようになりました。新規エンティティがインスタンス化されたときに、初期値を設定する必要がありますか? この新機能により、それが可能になりました! 詳細については続きを読み進めてください。
エンティティコンストラクター
ORDAデータモデルクラスでは、ストラクチャーに定義された Entityクラスのインスタンスであるエンティティオブジェクトを介してデータを扱います。4D 20 R10では、エンティティオブジェクトに constructor() を実装できるようになり、完全なオブジェクト指向のアプローチでの作業を可能にしました。
これは、たとえば タイムスタンプ や createdBy属性などのデフォルト値を初期化するのに最適な方法です。
これまでは、これを実行するために、おそらくデータクラスで createNew() のような関数を実装していたことでしょう。たとえば、Productsデータクラスがあったとして、デベロッパーはこのクラスに createNew() 関数があることを認識し、新規 Productsエンティティのインスタンス化に ds.Products.new() を使った自然なインスタンス化の手法を利用することができません。
この場合、デベロッパーが新規 Productsエンティティを作成するには、必ずこの関数を使用しなくてはなりません:
Form.product:=ds.Products.createNew()
コンストラクターの実装方法
コンストラクターを実装するには、Entity クラスに constructor() 関数を追加するだけです。
たとえば、ProductsEntityクラスの場合:
Class extends Entity
Class constructor()
This.stamp:=Timestamp()
This.createdBy:=Current user()
そして、呼び出しコードはとても自然です。たとえば、フォーム上に Products作成ボタンを設置し、次のコードを実行します:
Form.product:=ds.Products.new()
すると、Form.product のエンティティは、stamp とcreatedBy の属性が適切に設定された状態で作成されます!

また、constructor() は new() 関数によってのみ呼び出されるわけではありません。エンティティがどのような手段でインスタンス化されたとしても、コンストラクターがトリガーされます。
例:
– データエクスプローラーー (新規エンティティの作成時)
– fromCollection() 関数
– サーバー上で新規エンティティを作成する REST API コール ($method=update など)
– Qodlyアプリのフロントエンドや、リモートデータストアを使用する 4Dクライアントなど、クライアント上でインスタンス化されたエンティティを処理するための RESTサーバー上で実行されるコード。
その他の例
次の REST リクエストの場合を考えてみましょう:
127.0.0.1/rest/Products?method=update
この REST リクエストは、POST で実行され、その本文は次のとおりです:
[
{"name": "Red pack", "price": 50}
]
これがデータエクスプローラーでの結果です。stamp とcreatedBy の属性値は本文に指定されずとも自動で設定されます:

fromCollection() 関数を使用して Productsエンティティをインポートする場合を考えてみましょう:
var $products : cs.ProductsSelection
var $data:=New collection({name: "Red pack"; price: 50}; {name: "Green pack"; price: 10})
$products:=ds.Products.fromCollection($data)
下がその結果です。ここでも、stamp とcreatedBy の属性値はコレクション内で指定されずとも自動で設定されています:

このブログ記事では、constructor() の実装方法を説明しました。
C/S や4D Qodly Pro における constructor() の動作や、リモートデータストアを使用する際の動作については、こちらのブログ記事をご覧ください。
また、ドキュメントを確認し、HDI をぜひ試してみてください!
