オブジェクトの使用法
Caché には、複雑なトランザクション向きのアプリケーション要件に合うように設計された、フル機能の次世代オブジェクト・データベースが含まれています。
Caché オブジェクト・モデルには、以下の機能があります。
-
クラス — ユーザのアプリケーション・コンポーネントの状態 (データ) と動作 (コード) を決定するクラスを定義できます。クラスは、ランタイム・コンポーネントとして、あるいはデータベースに格納される項目として、オブジェクトのインスタンスを生成するために使用します。
-
プロパティ — クラスには、各オブジェクトのインスタンスに関連するデータを指定するプロパティがあります。プロパティは、単純なリテラル (文字列、数値など)、ユーザ定義型 (データ型クラスで定義される)、複雑なオブジェクト (あるいは埋め込みオブジェクト)、コレクション、他のオブジェクト参照です。
-
リレーションシップ — クラスは、オブジェクトのインスタンスが他のインスタンスにどのように関連しているかを定義できます。システムによって、リレーションシップのナビゲーション・メソッドと参照整合性がデータベース内に自動的に提供されます。
-
メソッド — クラスは、メソッドを使用し動作を定義します。メソッドとは、オブジェクトに関連付けられた実行可能なコードです。オブジェクト・メソッドは、Caché サーバ・プロセスで実行します (リモート・クライアントから実行できます)。オブジェクト・メソッドは、ObjectScript、SQL を使用して記述するか、またはメソッド・ジェネレータを使用して生成できます。メソッド・ジェネレータとは、ユーザが定義した規則に従ってカスタマイズされたメソッドを自動的に生成するコードです。
-
継承 — 新規クラスを既存のクラスから派生することで、以前記述したコードを再利用したり、特有なクラスを生成したりできます。
-
ポリモフィズム (多態) — Caché は、完全なオブジェクトのポリモフィズムをサポートします。つまり、アプリケーションは、適切なインタフェース (スーパークラスからのメソッドやプロパティのセット) を使用できます。またシステムは、各オブジェクト・タイプを基に、正確なインタフェースの実装を自動的に呼び出します。これにより、柔軟なデータベース・アプリケーションの開発が可能になります。
-
スウィズリング ("遅延ロード" としても知られる) — Caché は、オブジェクトが別のオブジェクトから参照される場合、関連する永続オブジェクトを自動的にスウィズル (ディスクからメモリに格納) します。これにより、複雑なデータ・モデルでの作業が大幅に簡素化されます。
Caché でオブジェクトを使用する方法についての詳細は、"Caché オブジェクトの使用法" を参照してください。
クラス定義
オブジェクトは、特定のクラスのインスタンスです。Caché では、さまざまな方法でクラスを定義することができます。クラスの定義方法の詳細は、"Caché オブジェクトの使用法" の以下のセクションを参照してください。
オブジェクト・インスタンスの生成
オブジェクト・インスタンスは、New コマンドを使用して新規のインスタンスを作成するか、OpenId コマンドを使用してデータベースに保存されている永続オブジェクトを開くことで作成できます。
New コマンド
New コマンドは指定されたクラスの新規のインスタンスを生成し、返します。次に例を示します。
person = New Sample.Person()
person.Name = "El Vez"
PrintLn person.Name
クラス名 (およびオプションでパッケージ名) の後には、New コマンドが続きます。クラス名の後には、括弧が続きます。この括弧内に引数を配置する場合、オブジェクトのコンストラクタ (%OnNew メソッド) に渡されます。
New コマンドは、ObjectScript で %New メソッドを呼び出す場合とまったく同じ動作をします。
OpenId コマンド
OpenId コマンドは、一意のオブジェクト識別子値を使用してデータベースに保存された、永続クラスのインスタンスを検索し、開いて、返します。次に例を示します。
person = OpenId Sample.Person(22)
PrintLn "Name: " & person.Name
PrintLn "Age: " & person.Age
クラス名 (およびオプションでパッケージ名) の後には、OpenId コマンドが続きます。クラス名の後には、OpenId コマンドの引数を含む括弧が続きます。OpenId コマンドは、以下の引数を取ります。
id | 必須項目。オブジェクトの検索に使用されるオブジェクト識別子。 |
concurrency | オプション。オブジェクトを開くために使用する、並行処理の設定。可能な値は "オブジェクト同時処理のオプション" を参照してください。 |
error | オプション。参照によって渡されるステータス・コード。処理が失敗した場合は、エラー情報も含まれます。 |
OpenId コマンドがオブジェクトを開くことができない場合、非オブジェクト値 (NULL 文字列) を返します。
OpenId コマンドはポリモフィックです。エクステント (1 つの永続オブジェクト内に一緒に保存されているサブクラス) 内に複数のタイプのオブジェクトが存在する場合、OpenId コマンドは与えられた ID 値に対応するオブジェクトのインスタンスを返します。
OpenId コマンドは、ObjectScript で %OpenId メソッドを呼び出す場合とまったく同じ動作をします。互換性のため、ObjectScript の %Open メソッドと同じ動作をする Open もあります。
オブジェクトのライフ・サイクル
オブジェクト・インスタンスは、そのインスタンスを参照する変数やオブジェクト・プロパティが存在しなくなったときに、自動的に消滅します。
例えば以下のコードで obj を空白文字列 ("") に設定すると、obj に参照するものがなくなるので、オブジェクトは閉じます。
person = New Sample.Person()
person = ""
プロシージャ、メソッド、およびその他のメンバ
ドット構文を使用して、オブジェクトのプロパティとメソッドを使用できます。
objref.Property
objref.Property = value
objref.Method()
ドット演算子の前の値が有効なオブジェクト・インスタンスでない場合は、実行時エラーが発生します。
プロパティの使用法
プロパティの値を取得、または設定するには、オブジェクトを参照する変数とドット演算子を使用します。
person = OpenId Sample.Person(22)
PrintLn person.Name
person.Name = "El Vez"
person = "" ' don't save changes...
カスケード・ドット構文を使用して、オブジェクト参照を続けることができます。
person = OpenId Sample.Person(22)
PrintLn person.Home.City
PrintLn person.Home.State
インスタンス・メソッド内部から、特殊変数 Me を使用して、同じオブジェクトの他のプロパティにアクセスすることができます。
Method PrintOut() [language = basic]
{
PrintLn Me.Name
}
インスタンス・メソッドの呼び出し
インスタンス・メソッドを呼び出すには、オブジェクトを参照する変数とドット演算子を使用するだけです。
person = New Sample.Person()
PrintLn person.NinetyNine()
インスタンス・メソッド内部から、特殊変数 Me を使用して、同じオブジェクトの他のインスタンス・メソッドを呼び出すことができます。
Method Test() [language = basic]
{
Me.Test2()
}
クラス・メソッドの呼び出し
クラス・メソッド (オブジェクト・インスタンスなしで呼び出し可能なメソッド) を呼び出すには、以下の構文を使用します。
"MyApp.MyClass".MyMethod(22)
クラス名 (およびオプションでパッケージ名) は、"" 内に配置され、その後にドット演算子とメソッドが続きます。
メソッドを呼び出す場合、引数はオプションですが、オプションを囲む括弧は必須です。引数を指定する場合は、クラス・メソッドの定義にある引数の数と順序に一致した方法で指定する必要があります。
引数値を省略するには、未定義の変数を指定する必要があります。これは、ObjectScript と Caché Basic の大きな違いです。ObjectScript では、以下の例に示すように、プレースホルダとしてコンマを使用することで、省略する引数を使用するメソッドを指定できます。
; ObjectScript example
SET tStatement = ##class(%SQL.Statement).%New(,"Sample")
WRITE !,"Success"
Caché Basic では、プレースホルダとしてコンマを使用することはできません。以下の例に示すように、未定義の変数を指定する必要があります。
' Cache Basic example
ERASE dummy
tStatement = New %SQL.Statement(dummy,"Sample")
PrintLn "Success"
両方の言語で、末尾の引数を指定する必要はありません。未定義の引数または省略した引数は、その引数に対する既定値を取ります。
With 文
With 文は、指定したオブジェクト・インスタンスで、オブジェクト変数名を再認識せずに、一連の文を実行します。次に例を示します。
person = OpenId Sample.Person(22)
With person
PrintLn .Name
PrintLn .SSN
PrintLn .Home.City
End With
Me.%GetParameter("Parameter") 構文
obj.%GetParameter 構文を使用すると、クラスのメソッド内からクラス・パラメータへの参照を行うことができます。例えば、クラス定義に以下のパラメータおよびメソッドが含まれているとします。
Parameter MyParam = 22;
そして、以下のメソッドも含まれているとします。
ClassMethod WriteMyParam() [ Language = basic ]
{
Print Me.%GetParameter("MyParam")
}
この場合、WriteMyParam メソッドは、引数として MyParam パラメータの値を含む Print コマンドを呼び出します。