|
WebObjects 5.2.3 | ||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
NSValidationインターフェースはオブジェクトの検証方法を定義しています。
特定の検証メソッドを直接実行するのではなく、名前(またはキー)でオブジェクトのプロパティを間接的に検証します。
このようにして、 オブジェクトのすべてのプロパティが一貫した方法で検証されます。
validateValueForKey
メソッドはプロパティ値が有効かどうかを調べ、 validateTakeValueForKeyPath
メソッドもプロパティ値が有効かどうかを調べた後、現在設定されている値と異なれば新しい値を設定します。
keyPath
プロパティに設定する value
が有効であることを検証します。
NSValidationインターフェースは、 NSValidation.DefaultImplementationとNSValidation.Utilityの2つの内部クラスを持っています。 前者はこのインターフェースのデフォルト実装であり、カスタムクラスを実装しやすくします。 後者は利便性の高いクラスで、同じコードでNSValidationオブジェクトとNSValidation以外のオブジェクトにアクセス可能にします。
NSValidation.DefaultImplementationのメソッドはNSValidationインターフェースのメソッドに似ていますが、引数を1つ多くとるクラスメソッドです。 その引数が操作されるオブジェクトです。
例えばEmployeeクラスを、NSValidation.DefaultImplementationを使って実装したいとします。
Employeeの validateValueForKey
メソッドは次のようになります。
public Object validateValueForKey(Object value, String key) { return NSValidation.DefaultImplementation.validateValueForKey(this, value, key); }
The NSValidation.DefaultImplementationのメソッドは、プロパティ特有のメソッド( validateKey のようなメソッド名)を検索し、見つかればそれを実行します。
NSValidationクラスには各プロパティの検証メソッドを実装する必要があります。
例えば validateAge
メソッドは、ユーザが入力した年齢が制限された範囲にあるかを調べ、無効な値であれば例外を発生させます。
検証ロジックは validateKey のメソッドに実装しますが、NSValidationのメソッドをスクラッチから実装する必要はほとんどありません。 通常はNSValidation.DefaultImplementationを使えば十分です。
注意: デフォルトの実装はパフォーマンスが最適化されています。 これを活かすには、NSValidation.DefaultImplementationのメソッドを使ってカスタムクラスを実装するか、NSValidationを実装したWebObjectsのクラスを継承することです。 ただし、継承した実装をオーバーライドしてはいけません。 独自の実装はパフォーマンスを低下させることになります。
NSValidation.Utilityクラスが便利なクラスであることを思い出してください。 このクラスはNSValidationオブジェクトであっても、そうでなくても、プロパティにアクセスするコードを共通して使えるようにします。
Utilityのメソッドは、クラスメソッドであることと引数が多いことが、DefaultImplemantationのメソッドと似ています。 1つ増えた引数は、メソッドが操作を行うオブジェクトです。 Utilityのメソッドは操作するオブジェクトがNSValidationオブジェクトであるかどうかを調べ、NSValidationのメソッドを実行します。 NSValidationオブジェクトでなければ、DefaultImplementationのメソッドを使ってオブジェクトを操作します。
例えば、NSValidationのAPIを使ってオブジェクトにアクセスしたいけれども、オブジェクトがNSValidationオブジェクトかどうかわからないとします。 この場合は次のようにUtilityクラスのAPIを使います。
theValue = NSValidation.Utility.validateValueForKey(object, value, key);
上のコードは、次のコードを短くしたものです。
if (object instanceof NSValidation) { theValue = ((NSValidation)object).validateValueForKey(key); } else { theValue = validateValueForKey.DefaultImplementation.validateValueForKey( object, value, key); }
NSValidationクラスで検証ロジックを実装するには、各プロパティの validateKey メソッドで必要な検証作業を実装します。 NSValidationのデフォルトの実装では、 validateKey メソッドがあればそれを使います。
validateKey メソッドは次のように定義します。
public Object validateKey(Object aValue) throws NSValidation.ValidationException
このメソッドでは引数が有効であるかどうか調べ、無効ならばNSValidation.ValidationExceptionを発生するよう実装する必要があります。 また、必要であれば適切な型に変換するべきです。 validateKey メソッドの引数の型はObjectであり、プロパティのクラス(String, Integer, NSTimestampなど)が明示的に指定されていないことに注意してください。 validateKey メソッドは引数の型をチェックし、必要であれば別の型に変換する必要があります。 validateKey の戻り値はObjectである必要はありません。 これはメソッドの戻り値(プロパティ)のクラスを指定するのに都合がいい方法です。 ただし、それとは異なり、引数の型はObjectにすべきです。
次の validateAge メソッドは、 Integerオブジェクトを持つ age
プロパティを検証する例です。
このメソッドはStringとNumberクラスのインスタンスを引数にとります。
引数が他のクラスのインスタンスの場合、NSValidation.ValidationExceptionを発生します。
public Number validateAge(Object aValue) throws NSValidation.ValidationException { Integer numberValue; int age; if (aValue instanceof String) { // StringからIntegerへ変換する try { numberValue = new Integer((String)aValue); } catch (NumberFormatException numberFormatException) { throw new NSValidation.ValidationException( "Validation exception: Unable to convert the String " + aValue + " to an Integer"); } } else if (aValue instanceof Number) { numberValue = new Integer(((Number)aValue).intValue()); } else { throw new NSValidation.ValidationException( "Validation exception: Unable to convert the Object " + aValue + " to an Integer"); } age = numberValue.intValue(); if (age < 16) { throw new NSValidation.ValidationException( "Age of " + age + " is below minimum.", this, "age"); } return numberValue; }
validateAge メソッドは引数のクラスをチェックします。 引数がStringかNumberオブジェクトであれば、Integerオブジェクトに変換してから検証します。 検証テストに失敗したら(16以下であれば)、NSValidation.ValidationExceptionを発生させます。 このオブジェクトの userInfo 辞書には、コンストラクタで与えられたNSValidationオブジェクトが含まれます。 検証テストをパスすればIntegerオブジェクトを返します。
validateKey メソッドの戻り値は、引数に与えられた値の代わりに検証後のオブジェクトが返されることが想定されています。
そのため、 validateKey メソッドは適切な型に変換する機会になります。
他の型変換の方法としては、 validateKey メソッドで null
を返すことができます。
例えば、引数に空の文字列が与えられたときに null
を返すようにします。
validateKey メソッドの引数の型は、特別なオブジェクトである必要はありません。 Objectかそのサブクラスになります。 しかし、Objectは validateKey メソッドの引数の型として(後で述べる例外を除いて)最も適切な型です。 「validateKeyメソッドの実装」で述べたように、 validateKey メソッドは妥当な引数の型を受け付けられる必要があります。 引数の型にはどんなオブジェクトにも共通するスーパークラス、すなわちObjectが最適なのです。
特定のプロパティの validateKey メソッドをオーバーロード(引数の型が異なる同名メソッドを実装する)してはいけません。 その代わりに、Object型(どんなオブジェクトにも共通するスーパークラス)の引数を取る validateKey メソッドを1つだけ実装するべきです。 このメソッドは引数の型をチェックし、適切な型に変換するよう実装すべきです。
引数の型にObjectではなく特定のクラスを指定するべき場合が1つだけあります。 それはプロパティの validateKey メソッドが1対1のリレーションシップを持つエンタープライズオブジェクトを扱う場合です。 この場合、引数の型をEOEnterpriseObjectにするべきです。
validateValueForKey(java.lang.Object, java.lang.String)
,
validateTakeValueForKeyPath(java.lang.Object, java.lang.String)
,
NSValidation.DefaultImplementation
,
NSValidation.Utility
,
NSKeyValueCoding
Nested Class Summary | |
static class |
NSValidation.DefaultImplementation
NSValidation.DefaultImplementationクラスのメソッドは、NSValidationインターフェースで定義されています。 ただし、すべてクラスメソッドであり、操作対象になるオブジェクトが引数に追加されています。 |
static class |
NSValidation.Utility
この利便性の高いクラスは、同じコードでNSValidationオブジェクトとNSValidation以外のオブジェクトにアクセス可能にします。 |
static class |
NSValidation.ValidationException
NSValidation.ValidationExceptionクラスのインスタンスは、NSValidationを実装したオブジェクトの検証中にエラーを発見したときに生成され、例外として投げられます。 |
Method Summary | |
Object |
validateTakeValueForKeyPath(Object value,
String keyPath)
keyPath プロパティに設定する value が有効であることを検証します。
|
Object |
validateValueForKey(Object value,
String key)
keyPath プロパティの値 value が有効であることを検証します。
|
Method Detail |
public Object validateTakeValueForKeyPath(Object value, String keyPath) throws NSValidation.ValidationException
keyPath
プロパティに設定する value
が有効であることを検証します。
value
が有効であれば、プロパティ値に新しい値を設定します。
カスタム検証メソッドが型変換をしたり代替値を用意すれば、新しい値は value
とは異なるでしょう。
最後にプロパティ値に設定したオブジェクトを返します。
デフォルトでは value
を返します。
value
がプロパティにとって無効な値であれば、 NSValidation.ValidationException
を発生します。
keyPath
は relationship.property
の書式になります(1つ以上のリレーションシップです)。
例えば "movieRole.roleName
" や "movieRole.talent.lastName
" になります。
NSValidation.DefaultImplementationのデフォルトの実装は、
valueForKey
を使って各キーのリレーションシップ先のオブジェクトを取得し、 value
と property を引数にして、最後のオブジェクトの validateValueForKey
メソッドを実行します。
value
- 検証後、 keyPath
プロパティに設定する値
keyPath
- 操作するプロパティのキーパス
value
か、他の型に変換された value
か、別の代替オブジェクト
NSValidation.ValidationException
- value
が無効の場合
NSKeyValueCoding.takeValueForKey(java.lang.Object, java.lang.String)
,
NSKeyValueCoding.valueForKey(java.lang.String)
,
validateValueForKey(java.lang.Object, java.lang.String)
,
NSValidation.DefaultImplementation
public Object validateValueForKey(Object value, String key) throws NSValidation.ValidationException
keyPath
プロパティの値 value
が有効であることを検証します。
有効であれば value
を返し、そうでなければ NSValidation.ValidationException
を発生します。
カスタム実装では、型変換された value
か代替オブジェクトを返します。
NSValidation.DefaultImplementationのデフォルトの実装は、 validate
Key の形式のメソッド( "budget
" なら validateBudget
)をチェックします。
メソッドがあれば実行して結果を返します。
これにより、NSValidationオブジェクトはプロパティごとに validate
Key を実装することができます。
制限をチェックしたり、無効な値を検証したり、型を変換(文字列から日付・数値への変換など)します。
メソッドがなければ value
を返します。
value
- 検証する値
key
- value
を検証するプロパティ名
value
か、他の型に変換された value
か、別の代替オブジェクト
NSValidation.ValidationException
- value
が無効の場合
NSKeyValueCoding.valueForKey(java.lang.String)
,
NSValidation.DefaultImplementation
|
Last updated Thu Oct 21 15:04:16 PDT 2004. | ||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |