WebObjects 5.2.3

com.webobjects.foundation
Interface NSValidation

All Known Subinterfaces:
EOEnterpriseObject, EOValidation
All Known Implementing Classes:
EOCustomObject, WOComponent, WODirectAction

public interface NSValidation

NSValidationインターフェースはオブジェクトの検証方法を定義しています。 特定の検証メソッドを直接実行するのではなく、名前(またはキー)でオブジェクトのプロパティを間接的に検証します。 このようにして、 オブジェクトのすべてのプロパティが一貫した方法で検証されます。 validateValueForKey メソッドはプロパティ値が有効かどうかを調べ、 validateTakeValueForKeyPath メソッドもプロパティ値が有効かどうかを調べた後、現在設定されている値と異なれば新しい値を設定します。

keyPath プロパティに設定する value が有効であることを検証します。

NSValidationインターフェースは、 NSValidation.DefaultImplementationとNSValidation.Utilityの2つの内部クラスを持っています。 前者はこのインターフェースのデフォルト実装であり、カスタムクラスを実装しやすくします。 後者は利便性の高いクラスで、同じコードでNSValidationオブジェクトと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のクラスを継承することです。 ただし、継承した実装をオーバーライドしてはいけません。 独自の実装はパフォーマンスを低下させることになります。

Utility

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);
    }

validateKeyメソッドの実装

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 の引数の型

validateKey メソッドの引数の型は、特別なオブジェクトである必要はありません。 Objectかそのサブクラスになります。 しかし、Objectは validateKey メソッドの引数の型として(後で述べる例外を除いて)最も適切な型です。 「validateKeyメソッドの実装」で述べたように、 validateKey メソッドは妥当な引数の型を受け付けられる必要があります。 引数の型にはどんなオブジェクトにも共通するスーパークラス、すなわちObjectが最適なのです。

特定のプロパティの validateKey メソッドをオーバーロード(引数の型が異なる同名メソッドを実装する)してはいけません。 その代わりに、Object型(どんなオブジェクトにも共通するスーパークラス)の引数を取る validateKey メソッドを1つだけ実装するべきです。 このメソッドは引数の型をチェックし、適切な型に変換するよう実装すべきです。

引数の型にObjectではなく特定のクラスを指定するべき場合が1つだけあります。 それはプロパティの validateKey メソッドが1対1のリレーションシップを持つエンタープライズオブジェクトを扱う場合です。 この場合、引数の型をEOEnterpriseObjectにするべきです。

See Also:
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

validateTakeValueForKeyPath

public Object validateTakeValueForKeyPath(Object value,
                                          String keyPath)
                                   throws NSValidation.ValidationException

keyPath プロパティに設定する value が有効であることを検証します。

value が有効であれば、プロパティ値に新しい値を設定します。 カスタム検証メソッドが型変換をしたり代替値を用意すれば、新しい値は value とは異なるでしょう。 最後にプロパティ値に設定したオブジェクトを返します。 デフォルトでは value を返します。 value がプロパティにとって無効な値であれば、 NSValidation.ValidationException を発生します。

keyPathrelationship.property の書式になります(1つ以上のリレーションシップです)。 例えば "movieRole.roleName" や "movieRole.talent.lastName" になります。

NSValidation.DefaultImplementationのデフォルトの実装は、 valueForKey を使って各キーのリレーションシップ先のオブジェクトを取得し、 valueproperty を引数にして、最後のオブジェクトの validateValueForKey メソッドを実行します。

Parameters:
value - 検証後、 keyPath プロパティに設定する値
keyPath - 操作するプロパティのキーパス
Returns:
value か、他の型に変換された value か、別の代替オブジェクト
Throws:
NSValidation.ValidationException - value が無効の場合
See Also:
NSKeyValueCoding.takeValueForKey(java.lang.Object, java.lang.String), NSKeyValueCoding.valueForKey(java.lang.String), validateValueForKey(java.lang.Object, java.lang.String), NSValidation.DefaultImplementation

validateValueForKey

public Object validateValueForKey(Object value,
                                  String key)
                           throws NSValidation.ValidationException

keyPath プロパティの値 value が有効であることを検証します。

有効であれば value を返し、そうでなければ NSValidation.ValidationException を発生します。 カスタム実装では、型変換された value か代替オブジェクトを返します。

NSValidation.DefaultImplementationのデフォルトの実装は、 validateKey の形式のメソッド( "budget" なら validateBudget )をチェックします。 メソッドがあれば実行して結果を返します。 これにより、NSValidationオブジェクトはプロパティごとに validateKey を実装することができます。 制限をチェックしたり、無効な値を検証したり、型を変換(文字列から日付・数値への変換など)します。 メソッドがなければ value を返します。

Parameters:
value - 検証する値
key - value を検証するプロパティ名
Returns:
value か、他の型に変換された value か、別の代替オブジェクト
Throws:
NSValidation.ValidationException - value が無効の場合
See Also:
NSKeyValueCoding.valueForKey(java.lang.String), NSValidation.DefaultImplementation

Last updated Thu Oct 21 15:04:16 PDT 2004.

Copyright © 2004 Apple Computer, Inc.