プロパティ・メソッドの使用法
ここでは、プロパティ・メソッドについて説明し、プロパティ・メソッドのリファレンス情報を提供します。OREF を使用してオブジェクトのプロパティを操作するとき、プロパティ・メソッドは InterSystems IRIS® データ・プラットフォームによって使用される実際のメソッドです。これらのメソッドは直接使用できます。
これらのメソッドを定義する方法については、"プロパティ・メソッドのオーバーライド" を参照してください。
概要
クラスにプロパティがある場合、クラス・コンパイラは各プロパティに多数のメソッドを自動的に生成し、それらを内部的に使用します。メソッドの名前は、プロパティ名に基づきます。多くの場合、これらのメソッドは存在しません。最善のパフォーマンスを得るために、単純なプロパティへのアクセスは仮想マシン内で直接実装されます。最後のセクションでは、これらのメソッドをリストするために使用できるサンプル・コードを提供します。
例えば、3 つのプロパティでクラス Person を定義する場合、以下のようになります。
Class MyApp.Person Extends %Persistent
{
Property Name As %String;
Property Age As %Integer;
Property DOB As %Date;
}
コンパイルすると、このクラスには以下のメソッドが含まれます。
-
NameDisplayToLogical()、NameGet()、NameGetStored()、NameIsValid()、NameLogicalToDisplay()、NameLogicalToOdbc()、NameNormalize()、NameSet()
-
AgeDisplayToLogical()、AgeGet()、AgeGetStored()、AgeIsValid()、AgeLogicalToDisplay()、AgeLogicalToOdbc()、AgeNormalize()、AgeSet()
-
DOBDisplayToLogical()、DOBGet()、DOBGetStored()、DOBIsValid()、DOBLogicalToDisplay()、DOBLogicalToOdbc()、DOBNormalize()、DOBSet()
これらのほとんどは、1 つの引数 (使用されるプロパティの値) を取るインスタンス・メソッドです。以下に例を示します。
Set x = person.DOBIsValid(person.DOB)
Write person.DOBLogicalToDisplay(person.DOB)
オブジェクト・プロパティを参照する InterSystems IRIS のドット構文は、値を取得および設定するアクセサ・メソッドのセットへのインタフェースです。それぞれの非計算プロパティについては、コードから oref.Prop (oref はオブジェクト、Prop はプロパティ) を参照すると、常にシステム提供の PropGet() メソッド、または PropSet() メソッドが呼び出されたかのように実行されます。以下に例を示します。
Set person.DOB = x
上記のコードは、以下のメソッドが呼び出されたかのように振る舞います。
Do person.DOBSet(x)
以下のコードは、
Write person.Name
以下のように振る舞います。
Write person.NameGet()
PropGet() メソッドおよび PropSet() メソッドを使用してオブジェクトのプロパティにアクセスするには、オブジェクトをメモリにロードする必要があります。一方、PropGetStored() クラス・メソッドを使用すると、保存されているオブジェクトのプロパティ値をディスクから直接取得できます。オブジェクト全体をメモリにロードする必要はありません。例えば、ID が 44 の個人の名前を書き込むには、以下のコードを使用できます。
Write ##class(MyApp.Person).NameGetStored(44)
データ形式
プロパティ・メソッドの多くは、データをある形式から別の形式に変換します。例えば、データを人が読める形式で表示するときや、ODBC 経由でデータにアクセスするときなどです。参考のために、形式を以下に示します。
-
Display — データの入力および表示形式。例えば、“April 3, 1998” や “23 November, 1977.” のフォームの日付。
-
Logical — データのメモリ内形式 (オペレーションが実行される形式)。日付には上記で説明したような表示形式を持ちますが、論理形式は整数です。上記のサンプルの日付では、論理形式のそれらの値は、それぞれ 57436 と 50000 です。
-
Storage — ディスク上のデータ形式 (データベースに格納されるデータの形式)。一般的に、これは論理形式と同じものです。
-
ODBC — データを ODBC または JDBC 経由で表すことのできる形式。この形式は、データが ODBC/SQL に公開されるときに使用されます。使用可能な形式は ODBC で定義したものに対応します。
-
XSD — SOAP でエンコードされた形式。この形式は、XML へのエクスポートまたは XML からのインポートの際に使用します。これは、XML 対応のクラスにのみ適用されます。
リファレンス
すべてのメソッド・シグニチャは、sampleprop というプロパティを使用する例です。
Method samplepropBuildValueArray(serializedcollection, byRef array) as %Status
例の名前 : samplepropBuildValueArray()
使用できる場所 : リストと配列のプロパティ。
シリアル化された形式のコレクション・オブジェクトが与えられると、このメソッドはそのコレクションを含む多次元配列を (参照によって) 返します。シリアル化された形式のコレクション・プロパティを取得するには、コレクション・オブジェクトの Serialize() メソッドを呼び出します。例えば、Sample.Person に以下のように定義されたプロパティがあるとします。
Property FavoriteColors As list Of %String;
以下は、このプロパティをシリアル化し、多次元配列を取得する例を示しています。
USER>set p=##class(Sample.Person).%OpenId(1)
USER>set serialized=p.FavoriteColors.Serialize()
USER>set status=p.FavoriteColorsBuildValueArray(serialized,.array)
USER>write status
1
USER>zw array
array(1)="red"
array(2)="pink"
array(3)="purple"
Method samplepropCollectionToDisplay(serializedcollection) as ReturnValue
使用できる場所 : リストと配列のプロパティ。
シリアル化された形式のコレクション・オブジェクトが与えられると、このメソッドは表示形式で値を返します。シリアル化された形式のコレクション・プロパティを取得するには、コレクション・オブジェクトの Serialize() メソッドを呼び出します。例えば、Sample.Person に以下のように定義されたプロパティがあるとします。
Property FavoriteColors As list Of %String;
以下は、このプロパティをシリアル化し、表示値を取得する例を示しています。
USER>set p=##class(Sample.Person).%OpenId(1)
USER>w p.FavoriteColorsCollectionToDisplay(p.FavoriteColors.Serialize())
red
pink
purple
Method samplepropCollectionToOdbc(serializedcollection) as ReturnValue
使用できる場所 : リストと配列のプロパティ。
シリアル化された形式のコレクション・オブジェクトが与えられると、このメソッドは ODBC 形式で値を返します。シリアル化された形式のコレクション・プロパティを取得するには、コレクション・オブジェクトの Serialize() メソッドを呼び出します。例えば、Sample.Person に以下のように定義されたプロパティがあるとします。
Property FavoriteColors As list Of %String;
以下は、このプロパティをシリアル化し、ODBC 値を取得する例を示しています。
USER>set p=##class(Sample.Person).%OpenId(1)
USER>w p.FavoriteColorsCollectionToDisplay(p.FavoriteColors.Serialize())
red,pink,purple
Method samplepropDisplayToCollection(delimitedstring) as ReturnValue
使用できる場所 : リストと配列のプロパティ。
このメソッドは区切り文字列を受け入れて、シリアル化されたコレクション値に変換します。
Method samplepropDisplayToLogical(InputValue) as ReturnValue
使用できる場所 : データ型クラスが DisplayToLogical() を定義する場合、リテラル値を含むリテラル・プロパティおよびリストと配列のプロパティ。
表示値が与えられると、このメソッドは、それをプロパティ定義に応じて適切な論理値に変換します。
例えば、以下のようなプロパティ定義を考えてみます。
Property Test(DISPLAYLIST = ",one,two,three", VALUELIST = ",1,2,3");
このプロパティを含むクラスのインスタンスを指定すると、次のように、two に対応する論理値を取得できます。
USER>write x.TestDisplayToLogical("two")
2
Method samplepropGet() as ReturnValue
使用できる場所 : リテラル・プロパティとオブジェクト値プロパティ。
このメソッドは、プロパティのメモリ内の値を返します。このメソッドは、SQL 経由でデータにアクセスするときは使用されません。
例 (リテラル・プロパティを示します) :
USER>set test=##class(Sample.Person).%OpenId(1)
USER>write test.NameGet()
Sample Name
オブジェクト値プロパティの場合、メモリ内の値は OREF です。
USER>set oref=test.AddressGet()
USER>write
oref=<OBJECT REFERENCE>[539@Sample.Address]
test=<OBJECT REFERENCE>[533@Sample.Person]
USER>w oref
539@Sample.Address
USER>w oref.Street
47 Pinkerton Way
Method samplepropGetObject() as OID
使用できる場所 : オブジェクト値プロパティ。
このメソッドは、プロパティに関連付けられている OID を取得します。このメソッドは、SQL 経由でデータにアクセスするときは使用されません。これは、OID が返される点を除き、GetObjectId() と似ています。
Method samplepropGetObjectId() as ID
使用できる場所 : オブジェクト値プロパティ。
このメソッドは、プロパティに関連付けられている ID を取得します。このメソッドは、SQL 経由でデータにアクセスするときは使用されません。
USER>set test=##class(Sample.Person).%OpenId(1000)
USER>write test.AddressGetObjectId()
5
この場合、Sample.Person の Address プロパティは、ID が 5 の Sample.Address オブジェクトです。
ClassMethod samplepropGetStored(id) as ReturnValue
使用できる場所 : リテラル・プロパティとオブジェクト値プロパティ。
保存したオブジェクトの ID が与えられると、このメソッドはオブジェクト全体をメモリにロードすることなく、指定されたプロパティの値をディスクから直接返します。このメソッドは、SQL 経由でデータにアクセスするときは使用されません。例えば、ID が 44 の個人の名前を書き込むには、以下のコードを使用できます。
USER>write ##class(Sample.Person).NameGetStored(44)
Sample Name
Method samplepropGetSwizzled(onlyCheck as %Boolean) as OREF
使用できる場所 : オブジェクト値プロパティ。
指定されたオブジェクト・インスタンスを開き、メモリにロードします。これは、スウィズリングと呼ばれます。
onlyCheck が省略された場合、このメソッドは指定されたオブジェクトをスウィズルして、そのオブジェクトの OREF を返します。onlyCheck が 1 の場合、メソッドはオブジェクトの OREF を返しますが、オブジェクトが既にスウィズルされている場合に限られます。そうでない場合、NULL の OREF が返されます。
以下に例を示します。
USER>set emp = ##class(Sample.Employee).%OpenId(102)
USER>set co = emp.CompanyGetSwizzled(1)
USER>if (co = "") {write "Company is not swizzled"} else {write co.Name}
Company is not swizzled
USER>set co = emp.CarGetSwizzled()
USER>if (co = "") {write "Company is not swizzled"} else {write co.Name}
Acme Company, Inc.
Method samplepropIsEmpty() as %Boolean
使用できる場所 : シリアル・プロパティ。例えば、Sample.Person に SerialAddress という名前の Sample.SerialAddress タイプのシリアル・クラスのプロパティがあるとします。
USER>set new=##class(Sample.Person).%New()
USER>write new.SerialAddressIsEmpty()
1
USER>set new.SerialAddress=##class(Sample.SerialAddress).%New()
USER>write new.SerialAddressIsEmpty()
1
USER>set new.SerialAddress.Street="17 Turnip Ave"
USER>write new.SerialAddressIsEmpty()
0
Method samplepropIsValid(InputValue) as %Status
使用できる場所 : リテラル・プロパティ (ネイティブのリスト形式に対応する %Library.ListOpens in a new tab を含む)、シリアル・プロパティ、およびリストと配列のプロパティ。
入力値が与えられると、このメソッドは、プロパティ定義に応じて適切な検証を実行します。
例えば、以下のようなプロパティ定義を考えてみます。
Property Test(DISPLAYLIST = ",one,two,three", VALUELIST = ",1,2,3");
値 3 はこのプロパティに有効ですが、値 4 は無効です。
USER>set x=##class(Sample.Person).%New()
USER>set status=x.TestIsValid(3)
USER>write status
1
USER>set status=x.TestIsValid(4)
USER>write status
0 M%,1,2,36USER-$e^zTestIsValid+1^Sample.Person.1^1e^^
USER>d $system.OBJ.DisplayError()
ERROR #7205: Datatype value '4' not in VALUELIST ',1,2,3'
Method samplepropLogicalToDisplay(InputValue) as ReturnValue
使用できる場所 : データ型クラスが LogicalToDisplay() を定義する場合、リテラル値を含むリテラル・プロパティおよびリストと配列のプロパティ。
論理値が与えられると、このメソッドは、それをプロパティ定義に応じて適切な表示値に変換します。
例えば、以下のようなプロパティ定義を考えてみます。
Property Test(DISPLAYLIST = ",one,two,three", VALUELIST = ",1,2,3");
このプロパティを含むクラスのインスタンスを指定すると、次のように、2 に対応する表示値を取得できます。
USER>write x.TestLogicalToDisplay(2)
two
Method samplepropLogicalToOdbc(InputValue) as ReturnValue
使用できる場所 : データ型クラスが LogicalToOdbc() を定義する場合、リテラル値を含むリテラル・プロパティおよびリストと配列のプロパティ。
論理入力値が与えられると、このメソッドは、それをプロパティ定義に応じて適切な ODBC 値に変換します。
例えば、Integer は integer 型のプロパティであるとします。このプロパティを含むクラスのインスタンス x を指定すると、次のように、このプロパティの ODBC 値を取得できます。
USER>write x.IntegerLogicalToOdbc("000056")
56
Method samplepropLogicalToXSD(InputValue) as ReturnValue
使用できる場所 : %XML.AdaptorOpens in a new tab を拡張するクラスで使用される場合、リテラル値を含むリテラル・プロパティおよびリストと配列のプロパティ。
論理入力値が与えられると、このメソッドは、それをプロパティ定義に応じて適切な SOAP でエンコードされた値に変換します。
例えば、Sample.Person に Boolean という名前の %BooleanOpens in a new tab 値のプロパティがあるとします。このプロパティを含むクラスのインスタンス p を指定すると、次のように、1 を適切な SOAP でエンコードされた値に変換できます。
USER>set p=##class(Sample.Person).%OpenId(1)
USER>write p.BooleanLogicalToXSD(1)
true
Method samplepropOdbcToCollection(delimitedstring) as ReturnValue
使用できる場所 : リストと配列のプロパティ。
このメソッドは ODBC 値の区切り文字列を受け入れて、シリアル化されたコレクション値に変換します。
Method samplepropNewObject() as OREF
使用できる場所 : オブジェクト値プロパティ (リストと配列のプロパティを除く)。
指定されたクラスの新しいインスタンスを参照する OREF を返し、プロパティをこのインスタンスと同じに設定します。以下に例を示します。
USER>set p=##class(Sample.Person).%New()
USER>set address=p.AddressNewObject()
USER>write address
604@Sample.Address
前述した構文は、以下と等価です。
USER>set p=##class(Sample.Person).%New()
USER>set address=p.Address
USER>set address=##class(Sample.Address).%New()
USER>write address
604@Sample.Address
Method samplepropNormalize(InputValue) as ReturnValue
使用できる場所 : リテラル値を含むリテラル・プロパティおよびリストと配列のプロパティ。
入力値が与えられると、このメソッドは、プロパティ定義に応じて適切に値を正規化します。
例えば、Integer は integer 型のプロパティであるとします。このプロパティを含むクラスのインスタンス x を指定すると、次のように、このプロパティの正規化された値を取得できます。
USER>write x.IntegerNormalize(000078.0000)
78
Method samplepropSet(InputValue) as %Status
使用できる場所 : リテラル・プロパティとオブジェクト値プロパティ。
入力値が与えられると、このメソッドはプロパティをこの値に設定します。プロパティがオブジェクト値の場合、入力値は OREF でなければなりません。このメソッドは %StatusOpens in a new tab を返します。このメソッドは、SQL 経由でデータにアクセスするときは使用されません。以下に例を示します。
USER>set test=##class(Sample.Person).%New()
USER>set status=test.NameSet("Sample Name")
USER>write status
1
別の例として、Sample.Person に ObjectProp という名前の Sample.OtherClass タイプのプロパティがあるとします。
USER>set test=##class(Sample.Person).%New()
USER>set other=##class(Sample.OtherClass).%New()
USER>set status=test.ObjectPropSet(other)
USER>write status
1
Method samplepropSetObject(Oid) as %Status
使用できる場所 : オブジェクト値プロパティ。
オブジェクトの OID が与えられると、このメソッドはその OID を使用してプロパティを設定します。これは、ID ではなく OID を使用する点を除き、SetObjectId() と似ています。このメソッドは、SQL 経由でデータにアクセスするときは使用されません。
Method samplepropSetObjectId(Id) as %Status
使用できる場所 : オブジェクト値プロパティ。
オブジェクトの ID が与えられると、このメソッドはその ID を使用してプロパティを設定します。このメソッドは、SQL 経由でデータにアクセスするときは使用されません。例えば、Sample.Person に Sample.Address タイプの Address プロパティがあるとします。
USER>set test=##class(Sample.Person).%New()
USER>set status=test.AddressSetObjectId(14)
このコードは、Address プロパティを ID が 14 の Sample.Address インスタンスと同じに設定します。
Method samplepropXSDToLogical(InputValue) as ReturnValue
使用できる場所 : %XML.AdaptorOpens in a new tab を拡張するクラスで使用される場合、リテラル値を含むリテラル・プロパティおよびリストと配列のプロパティ。
SOAP でエンコードされた入力値が与えられると、このメソッドは、それをプロパティ定義に応じて適切な論理値に変換します。
例えば、Sample.Person に Boolean という名前の %BooleanOpens in a new tab 値のプロパティがあるとします。このプロパティを含むクラスのインスタンス p を指定すると、次のように、true を適切な論理値に変換できます。
USER>set p=##class(Sample.Person).%OpenId(1)
USER>write p.BooleanXSDToLogical("true")
1
プロパティ・メソッドのリスト
以下のサンプル・コードは、%Dictionary API を使用し、指定されたクラスの指定されたメソッドに対して生成されたプロパティ・メソッドを表示します。
ClassMethod DisplayPropertyMethods(className As %String = "", propertyName As %String = "")
{
Set cdef=##class(%Dictionary.CompiledClass).%OpenId(className)
Set propertynamelength=$LENGTH(propertyName)
Set methodlist=cdef.Methods
#dim item as %Dictionary.CompiledMethod
For i=1:1:methodlist.Count() {
Set item=methodlist.GetAt(i)
Set methodname=item.Name
Set extract=$extract(methodname,0,propertynamelength)
// This checks that the method name starts with the property name.
// There will be false positives when one property name
// starts with the same characters as another
If (extract=propertyName) {
Write !, methodname
}
}
}
以下に例を示します。
USER>do ##class(Tools.Tools).DisplayPropertyMethods("Sample.Person","Test")
TestDisplayToLogical
TestGet
TestGetStored
TestIsValid
TestLogicalToDisplay
TestLogicalToOdbc
TestNormalize
TestSet