データ型クラスの定義
ここでは、データ型クラスがどのように機能するかについて説明します。また、それらのクラスを定義する方法も説明します。
概要
データ型クラスは、オブジェクト・クラスのリテラル・プロパティのタイプとして使用されます。データ型クラスには、以下の機能があります。
-
SQL 論理操作、クライアント・データ型、および変換情報の提供による、SQL およびクライアントの相互運用性
-
データ型クラス・パラメータを使用して拡張、またはカスタマイズできるリテラル・データ値の妥当性検証
-
これらは、(ディスク上に) 格納された、論理 (メモリ内) 形式、および表示形式に対するリテラル・データの変換を管理します。
データ型クラスは、コンパイラがプロパティの動作を定義するために使用する、特定のメソッドのセット (通常はメソッド・ジェネレータ) を定義します。データ型クラスはオブジェクト・クラスではありません (つまり、%RegisteredObjectOpens in a new tab から継承されません)。
クラスにプロパティがある場合、クラスはプロパティ値にアクセスして操作するためのメソッドのセットを自動的に保有します。これらはプロパティ・メソッドと呼ばれ、その名前はプロパティ名に基づきます。例えば、クラスに Name という文字列プロパティが含まれる場合、クラスには NameDisplayToLogical()、NameGet()、NameGetStored()、NameIsValid()、NameLogicalToDisplay()、NameLogicalToOdbc()、NameNormalize()、および NameSet() というメソッドが含まれます。InterSystems IRIS では、プロパティ・メソッドを内部的に使用して、プロパティ値にアクセスし、これを操作します。これらのメソッドを直接呼び出すこともできます。"プロパティ・メソッドの使用法" を参照してください。
データ型クラスのパラメータ
データ型クラスには、既定の動作を定義するクラス・パラメータを含めることができます。この既定の動作は、そのデータ型クラスに基づいて特定のプロパティに対してオーバーライドできます。例えば、%IntegerOpens in a new tab データ型クラスは、クラス・パラメータ MAXVAL を持ち、%IntegerOpens in a new tab 型のプロパティに対して最大有効値を指定します。プロパティ NumKids を持つクラスを、以下のように定義した場合、
Property NumKids As %Integer(MAXVAL=10);
これは、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 を別個のルーチンに配置すると、このルーチンをメソッドで呼び出せるようになります。
-
これらのメソッドはプロシージャ・ブロック内で使用されるため、NEW を使用して、パーセント変数以外の変数に新しいスコープを指定することはできません。
ほとんどの場合、これらのメソッドをメソッド・ジェネレータとして定義することが推奨されます。
データ型クラスのインスタンス・メソッドの定義
データ型クラスには、インスタンス・メソッドを追加することもできます。これらのメソッドは、プロパティの現在の値を含む変数 %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/2024