データ型クラスの定義
ここでは、データ型クラスがどのように機能するかについて説明します。また、それらのクラスを定義する方法も説明します。
データ型クラスの概要
データ型クラスの目的は、オブジェクト・クラスのリテラル・プロパティのタイプとして使用されることです。データ型クラスには、以下の機能があります。
-
SQL 論理操作、クライアント・データ型、および変換情報の提供による、SQL およびクライアントの相互運用性
-
データ型クラス・パラメータを使用して拡張、またはカスタマイズできるリテラル・データ値の妥当性検証
-
これらは、(ディスク上に) 格納された、論理 (メモリ内) 形式、および表示形式に対するリテラル・データの変換を管理します。
データ型クラスを使用した、コンパイラによるプロパティのコード生成の詳細は、"プロパティ・メソッド" を参照してください。
データ型は他のクラスとは異なる点がいくつかあります。
-
独立してインスタンス化されたり、格納することはできません。
-
プロパティを持つことはできません。
-
以下に示すような特定のメソッド (データ型インタフェース) に対応します。
内部の詳細をいくらかでも知っていると役に立つので、このセクションでは、データ型クラスがどのように機能するかについて、手短に説明します。
前述のように、データ型クラスの目的はプロパティのタイプとして (特に重要なオブジェクト・クラスの 1 つを拡張するクラス内で) 使用されることです。3 つのプロパティを持っているオブジェクト・クラスの例を以下に示します。各プロパティは、プロパティのタイプとしてデータ型クラスを使用します。
Class Datatypes.Container Extends %RegisteredObject
{
Property P1 As %String;
Property P2 As %Integer;
Property P3 As %Boolean;
}
プロパティ・メソッド
クラスにリテラル・プロパティを追加してクラスをコンパイルすると、InterSystems IRIS® データ・プラットフォームによって、そのクラスにプロパティ・メソッドが追加されます。参考として、プロパティを含むクラスをコンテナ・クラスという用語を使用して表します。プロパティ・メソッドは、コンテナ・クラスがそれらのプロパティのデータを処理する方法を制御します。このシステムは、以下のように実行されます。
-
各データ型クラスは、メソッドのセット (具体的にはメソッド・ジェネレータ) を提供します。このセットは、メソッドを使用するクラスをコンパイルするときに、InterSystems IRIS によって使用されます。メソッド・ジェネレータは、独自の実行時コードを生成するメソッドです。
ここに示す例では、Datatypes.Container をコンパイルするとき、コンパイラは %StringOpens in a new tab、%IntegerOpens in a new tab、および %BooleanOpens in a new tab データ型クラスのメソッド・ジェネレータを使用します。これらのメソッド・ジェネレータは各プロパティのメソッドを作成し、作成したメソッドをコンテナ・クラスに追加します。前述したように、これらのメソッドはプロパティ・メソッドと呼ばれます。それらの名前は、適用先のプロパティの名前で始まります。例えば、P1 プロパティの場合、コンパイラは P1IsValid()、P1Normalize()、P1LogicalToDisplay()、P1DisplayToLogical() などのメソッドを生成します。
-
コンテナ・クラスは処理中の適切な段階で、自動的にプロパティ・メソッドを呼び出します。例えば、前述のクラスのインスタンスの %ValidateObject() インスタンス・メソッドを呼び出すとき、メソッドは P1IsValid()、P2IsValid()、および P3IsValid() を順番に呼び出します。つまり、メソッドは各プロパティの IsValid() メソッドを呼び出します。もう 1 つ例を挙げると、コンテナ・クラスが永続で、InterSystems SQL を使用して関連テーブルのすべてのフィールドにアクセスする場合、SQL の実行時モードが ODBC なら、InterSystems IRIS は各プロパティの LogicalToOdbc() メソッドを呼び出します。これにより、クエリは ODBC 形式で結果を返します。
プロパティ・メソッドはクラス定義には表示されないので、注意が必要です。
これらのメソッドはすべてクラス・メソッドで、そのすべてに、妥当性のチェック、正規化、変換を行う値などの引数が必要です。
データ形式
プロパティ・メソッドの多くは、データをある形式から別の形式に変換します。例えば、データを人が読める形式で表示するときや、ODBC 経由でデータにアクセスするときなどです。形式は以下のとおりです。
-
Display — データの入力および表示形式。例えば、“April 3, 1998” や “23 November, 1977.” のフォームの日付。
-
Logical — データのメモリ内形式 (オペレーションが実行される形式)。日付には上記で説明したような表示形式を持ちますが、論理形式は整数です。上記のサンプルの日付では、論理形式のそれらの値は、それぞれ 57436 と 50000 です。
-
Storage — ディスク上のデータ形式 (データベースに格納されるデータの形式)。一般的に、これは論理形式と同じものです。
-
ODBC — データを ODBC または JDBC 経由で表すことのできる形式。この形式は、データが ODBC/SQL に公開されるときに使用されます。使用可能な形式は ODBC で定義したものに対応します。
-
XSD — SOAP でエンコードされた形式。この形式は、XML へのエクスポートまたは XML からのインポートの際に使用します。これは、XML 対応のクラスにのみ適用されます。
データ型クラスのパラメータ
クラス・パラメータは、データ型クラスで使用されるときに、特別な振る舞いをします。データ型クラスでは、クラス・パラメータはデータ型に基づいてプロパティの動作をカスタマイズする方法を提供するために使用されます。
例えば、%IntegerOpens in a new tab データ型クラスは、クラス・パラメータ MAXVAL を持ち、%IntegerOpens in a new tab 型のプロパティに対して最大有効値を指定します。プロパティ NumKids を持つクラスを、以下のように定義した場合、
Property NumKids As %Integer(MAXVAL=10);
これは、%IntegerOpens in a new tab クラスの MAXVAL パラメータを、NumKids プロパティに対して 10 に設定することを指定します。
内部的には、標準データ型クラスに対するすべての検証メソッドは、メソッド・ジェネレータとして実装され、さまざまなクラス・パラメータを使用して、これらの検証メソッドの生成を制御します。この例では、NumKids の値が 10 を超えるか否かをテストする NumKidsIsValid() メソッドに対するコンテンツをこのプロパティ定義で生成します。クラス・パラメータを使用せずに、この機能を作成するには IntegerLessThanTen クラスの定義が必要です。
データ型クラスの定義
データ型クラスを簡単に定義するには、まず自分の要求に近い既存のデータ型クラスを特定します。このクラスのサブクラスを作成します。サブクラスで以下を実行します。
-
キーワード SqlCategory、ClientDataType、および OdbcType に適切な値を指定します。
-
必要に応じて、クラス・パラメータをオーバーライドします。例えば、MAXLEN パラメータをオーバーライドして、プロパティの長さを無制限にすることもできます。
必要に応じて、ユーザ独自のクラス・パラメータを追加します。
-
必要に応じて、データ型クラスのメソッドをオーバーライドします。必要に応じて、実装時にこのクラスのパラメータを参照します。
データ型クラスが既存のデータ型クラスに基づいていない場合は、必ずクラス定義に [ ClassType=datatype ] を追加してください。クラスが別のデータ型クラスに基づく場合、この宣言は必要ありません。
データ型クラスにプロパティを含めることはできないため、データ型クラスを定義する際に、%PersistentOpens in a new tab や %RegisteredObjectOpens in a new tab などのオブジェクト・クラスを拡張しないでください。
データ型クラスのクラス・メソッドの定義
要求の内容に応じて、以下に示すデータ型クラスのクラス・メソッドの一部または全部を定義します。
-
IsValid() — 必要に応じてプロパティ・パラメータを使用して、プロパティのデータの検証を行います。前述したように、オブジェクト・クラスの %ValidateObject() インスタンス・メソッドは、各プロパティの IsValid() メソッドを呼び出します。このメソッドには、以下のシグニチャがあります。
ClassMethod IsValid(%val) As %Status
%val は検証される値です。このメソッドは、値が無効の場合にはエラー・ステータスを返し、それ以外の場合には $$$OK を返します。
Note:NULL 値に対しては検証ロジックを呼び出さないのが InterSystems IRIS での標準的なやり方です。
-
Normalize() — プロパティのデータを標準フォームまたは標準形式に変換します。オブジェクト・クラスの %NormalizeObject() インスタンス・メソッドは、各プロパティの Normalize() メソッドを呼び出します。このメソッドには、以下のシグニチャがあります。
ClassMethod Normalize(%val) As Type
%val は検証される値、Type は適切なタイプのクラスです。
-
DisplayToLogical() — 表示値を論理値に変換します。(形式の詳細は、"データ形式" を参照してください。)このメソッドには、以下のシグニチャがあります。
ClassMethod DisplayToLogical(%val) As Type
%val は変換される値、Type は適切なタイプのクラスです。
その他の形式変換メソッドには、同様の一般的な形式があります。
-
LogicalToDisplay() — 論理値を表示値に変換します。
-
LogicalToOdbc() — 論理値を ODBC 値に変換します。
ODBC の値は、データ型クラスの OdbcType クラス・キーワードで指定された ODBC のタイプと一致している必要があります。
-
LogicalToStorage() — 論理値をストレージ値に変換します。
-
LogicalToXSD() — 論理値を SOAP でエンコードされた適切な値に変換します。
-
OdbcToLogical() — ODBC 値を論理値に変換します。
-
StorageToLogical() — データベースのストレージ値を論理値に変換します。
-
XSDToLogical() — SOAP でエンコードされた値を論理値に変換します。
これらのメソッドはすべてクラス・メソッドで、そのすべては、妥当性のチェック、正規化、変換を行う値などの引数を受け入れる必要があります。
データ型クラスに DISPLAYLIST パラメータと VALUELIST パラメータが含まれる場合、これらのメソッドは、最初にこれらのクラスのパラメータが存在するかを確認し、存在する場合は、これらのリストを処理するコードを含める必要があります。このロジックは、その他のメソッドと類似しています。
ほとんどの場合、これらのメソッドの多くはメソッド・ジェネレータです。
データの書式設定と変換のメソッドには、埋め込み SQL を含めることはできません。このロジックで埋め込み SQL を呼び出す必要がある場合は、埋め込み SQL を別個のルーチンに配置すると、このルーチンをメソッドで呼び出せるようになります。
データ型クラスのインスタンス・メソッドの定義
データ型クラスには、インスタンス・メソッドを追加することもできます。これらのメソッドは、プロパティの現在の値を含む変数 %val を使用できます。コンパイラはこれらを使用して、データ型クラスを使用するクラスの関連プロパティ・メソッドを生成します。例えば、以下のデータ型クラスの例を考えてみます。
Class Datatypes.MyDate Extends %Date
{
Method ToMyDate() As %String [ CodeMode = expression ]
{
$ZDate(%val,4)
}
}
以下に示す、別のクラスがあるとします。
Class Datatypes.Container Extends %Persistent
{
Property DOB As Datatypes.MyDate;
/// additional class members
}
これらのクラスをコンパイルすると、InterSystems IRIS によって DOBToMyDate() インスタンス・メソッドがコンテナ・クラスに追加されます。このメソッドは、後でコンテナ・クラスのインスタンスを作成するときに呼び出すことができます。以下に例を示します。
TESTNAMESPACE>set instance=##class(Datatypes.Container).%New()
TESTNAMESPACE>set instance.DOB=+$H
TESTNAMESPACE>write instance.DOBToMyDate()
30/10/2014