データモデルクラス
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 汎用クラス の関数を呼び出すことができます。
クラスの説明
履歴
リリース | 内容 |
---|---|
19 R4 | Entity クラスのエイリアス属性 |
19 R3 | 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()
計算属性 は Entity クラス において定義されます。
リモートデータストアの例
次の 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
例題
// cs.EmployeeSelection クラス
Class extends EntitySelection
// 給与が平均超えの社員を当該エンティティセレクションから抽出します
Function withSalaryGreaterThanAverage
C_OBJECT($0)
$0:=This.query("salary > :1";This.average("salary")).orderBy("salary")
任意の社員エンティティセレクションより、給与が平均以上の社員を取得するには:
$moreThanAvg:=ds.Company.all().employees.withSalaryGreaterThanAverage()
Entity クラス
ORDA で公開されるテーブル毎に、Entity クラスが cs
クラスストアに公開されます。
- 親クラス: 4D.Entity
- クラス名: DataClassNameEntity (DataClassName はテーブル名です)
- 例: cs.CityEntity
計算属性
Entity クラスでは、専用のキーワードを使用して 計算属性 を定義することができます:
Function get
attributeNameFunction set
attributeNameFunction query
attributeNameFunction orderBy
attributeName
詳細については、計算属性 を参照してください。
エイリアス属性
Entity クラスでは、Alias
キーワードを使用して エイリアス属性 を定義することができます (通常はリレート属性を対象に定義します):
Alias
attributeName targetPath
詳細については、エイリアス属性 を参照してください。
例題
// cs.CityEntity クラス
Class extends Entity
Function getPopulation()
$0:=This.zips.sum("population")
Function isBigCity(): Boolean
// 関数 getPopulation() をクラス内で使用することができます
$0:=This.getPopulation()>50000
次のように関数を呼び出すことができます:
var $cityManager; $city : Object
$cityManager:=Open datastore(New object("hostname";"127.0.0.1:8111");"CityManager")
$city:=$cityManager.City.getCity("Caguas")
If ($city.isBigCity())
ALERT($city.name + " は大きな町です。")
End if