データモデルクラス
ORDA を使用して、データモデル上に高レベルクラス関数を作成することができます。 これによってビジネス指向のコードを書き、APIのように "公開" することができます。 データストア、データクラス、エンティティ、およびエンティティセレクションはそれぞれ、関数を持つことのできるクラスオブジェクトとして提供されています。
たとえば、選択中の社員より給与の高い社員一覧を返す getNextWithHigherSalary()
関数を EmployeeEntity
クラスに作成したとします。 この関数は簡単に呼び出すことができます:
$nextHigh:=ds.Employee.get(1).getNextWithHigherSalary()
これらの関数はローカルデータストアだけでなく、クライアント/サーバーやリモートアーキテクチャーでも使用することができます:
//$cityManager はリモートデータストアへの参照です
Form.comp.city:=$cityManager.City.getCityName(Form.comp.zipcode)
この機能により、4D アプルケーションのビジネスロジックをまるごと独立したレイヤーに保存し、高レベルのセキュリティで簡単に管理・利用することができます:
-
わかりやすく使いやすい関数のみを公開し、その裏にある構造の複雑性を "隠す" ことができます。
-
構造が発展した場合には影響を受ける関数を適応させるだけで、クライアントアプリケーションは引き続き透過的にそれらを呼び出すことができます。
-
デフォルトでは、データモデルクラス関数はすべて、リモートアプリケーションに対し 非公開 に設定されており、RESTリクエストで呼び出すことはできません。 公開する関数は
exposed
キーワードによって明示的に宣言する必要があります。
各データモデルオブジェクトに関わるクラスは、4D によって あらかじめ自動的に作成 されます。
アーキテクチャー
ORDA では、4D
クラスストア を介して公開される 汎用クラス と、cs
クラスストア で公開される ユーザークラス が提供されています:
ORDA データモデルクラスはすべて cs
クラスストアのプロパティとして公開されます。 次の ORDA クラスが提供されています:
クラス | 例 | 次によってインスタンス化されます |
---|---|---|
cs.DataStore | cs.DataStore | ds コマンド |
cs.DataClassName | cs.Employee | dataStore.DataClassName , dataStore["DataClassName"] |
cs.DataClassNameEntity | cs.EmployeeEntity | dataClass.get() , dataClass.new() , entitySelection.first() , entitySelection.last() , entity.previous() , entity.next() , entity.first() , entity.last() , entity.clone() |
cs.DataClassNameSelection | cs.EmployeeSelection | dataClass.query() , entitySelection.query() , dataClass.all() , dataClass.fromCollection() , dataClass.newSelection() , entitySelection.drop() , entity.getSelection() , entitySelection.and() , entitySelection.minus() , entitySelection.or() , entitySelection.orderBy() , entitySelection.orderByFormula() , entitySelection.slice() , Create entity selection |
ORDA ユーザークラスは通常のクラスファイル (.4dm) としてプロジェクトの Classes サブフォルダーに保存されます (後述参照)。
ORDA データモデルユーザークラスのオブジェクトインスタンスは、それらの親クラスのプロパティや関数を使うことができます:
- Datastore クラスオブジェクトは、ORDA Datastore 汎用クラス の関数を呼び出すことができます。
- DataClass クラスオブジェクトは、ORDA DataClass 汎用クラス の関数を呼び出すことができます。
- EntitySelection クラスオブジェクトは ORDA EntitySelection 汎用クラス の関数を呼び出すことができます。
- Entity クラスオブジェクトは ORDA Entity 汎用クラス の関数を呼び出すことができます。
クラスの説明
履歴
リリース | 内容 |
---|---|
18 R5 | データモデルクラス関数は、デフォルトでは REST に公開されません。 新しい exposed および local キーワード。 |
DataStore クラス
4D のデータベースは、自身の DataStore クラスを cs
クラスストアに公開します。
- 親クラス: 4D.DataStoreImplementation
- クラス名: cs.DataStore
DataStore クラス内には、ds
オブジェクトを介して使用する関数を作成することができます。
例題
// cs.DataStore class
Class extends DataStoreImplementation
Function getDesc
$0:="社員と会社を公開するデータベース"
この関数は次のように使えます:
$desc:=ds.getDesc() //"社員と会社を..."
DataClass クラス
ORDA で公開されるテーブル毎に、DataClass クラスが cs
クラスストアに公開されます。
- 親クラス: 4D.DataClass
- クラス名: cs.DataClassName (DataClassName はテーブル名です)
- 例: cs.Employee
例題
// cs.Company クラス
Class extends DataClass
// 収益が平均以上の会社を返します
// Company DataClass にリレートしているエンティティセレクションを返します
Function GetBestOnes()
$sel:=This.query("revenues >= :1";This.all().average("revenues"));
$0:=$sel
全会社データから平均以上の会社デー タをエンティティセレクションに抽出するには次を実行します:
var $best : cs.CompanySelection
$best:=ds.Company.GetBestOnes()
リモートデータストアの例
次の City カタログをリモートデータストアとして公開しています:
City クラス
は API を提供しています:
// cs.City クラス
Class extends DataClass
Function getCityName()
var $1; $zipcode : Integer
var $zip : 4D.Entity
var $0 : Text
$zipcode:=$1
$zip:=ds.ZipCode.get($zipcode)
$0:=""
If ($zip#Null)
$0:=$zip.city.name
End if
クライアントはまず、リモートデータストアのセッションを開始します:
$cityManager:=Open datastore(New object("hostname";"127.0.0.1:8111");"CityManager")
クライアントアプリケーションは API を使い、たとえばフォームに入力された郵便番号 (zipcode) に合致する都市を取得 することができます:
Form.comp.city:=$cityManager.City.getCityName(Form.comp.zipcode)
EntitySelection クラス
ORDA で公開されるテーブル毎に、EntitySelection クラスが cs
クラスストアに公開されます。
- 親クラス: 4D.EntitySelection
- クラス名: DataClassNameSelection (DataClassName はテーブル名です)
- 例: cs.EmployeeSelection