ORDA – エンティティコンストラクターの紹介

4Dランゲージはクラスの概念を、ひいては コンストラクターの概念をサポートしています。

他方、ORDA の抽象化レイヤーは、データモデルクラスを通して、大きなビジネス上の利点を提供しています。ビジネス指向のコードを書き、それを API のように “公開” することができます。データストアデータクラスエンティティセレクションエンティティはすべて、関数や計算属性エイリアス属性を持てるクラスオブジェクトとして利用できます。

これにより、アプリは強力かつ最適化されたコードで、MVCの原則に簡単に従うことができます。

4D 20 R10 より、完全なオブジェクト指向のアプローチで作業するため、Entity クラスconstructor() を設定できるようになりました。新規エンティティがインスタンス化されたときに、初期値を設定する必要がありますか? この新機能により、それが可能になりました! 詳細については続きを読み進めてください。

HDI: ORDA: Entityクラスのコンストラクター

エンティティコンストラクター

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 のエンティティは、stampcreatedBy の属性が適切に設定された状態で作成されます!

 

また、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}
]

これがデータエクスプローラーでの結果です。stampcreatedBy の属性値は本文に指定されずとも自動で設定されます:

blank

 

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)

下がその結果です。ここでも、stampcreatedBy の属性値はコレクション内で指定されずとも自動で設定されています:

blank

このブログ記事では、constructor() の実装方法を説明しました。

C/S や4D Qodly Pro における constructor() の動作や、リモートデータストアを使用する際の動作については、こちらのブログ記事をご覧ください。

また、ドキュメントを確認し、HDI をぜひ試してみてください!

Avatar
- プロダクトオーナー - Marie-Sophie Landrieu-Yvertは、2017年にプロダクトオーナーとして4Dプロダクトチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。彼女は1995年にESIGELEC Engineering Schoolを卒業し、IBMでエンジニアとしてのキャリアをスタートさせました。様々なプロジェクト(保守や新規のプロジェクト)に参加し、Cobolのデベロッパーとして働きました。その後、UMLデザイナーおよびJavaデベロッパーとして勤務。最近は、機能要件の分析・記述、ビジネスチームと開発チームの調整などを主に担当しています。