2006 年 4 月 9 日 22 時 22 分

lvalue の限界


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


プロパティには、他にも重要な機能がある。
それは、setter/getter による値の検証や、
読み取り専用、書き込み専用などの制限だ。

フィールドとして公開した場合、ただの変数となるので、
外部から自由にアクセスできてしまうが、
プロパティとした場合は、setter/getter が、
代入値の検証や、取得の可否などのチェック機能となる。

昨日の時点で、構文としてのプロパティは実装できたが、
それ以外の部分はどうだろうか。

lvalue の実装では、構文上の代入が可能なだけだ。
なので、以下のような制約がある。

・値の検証ができない。

lvalue サブルーチンは、プロパティとしてカプセル化する
フィールド(スカラ変数)がどれであるか示すだけである。
つまり、プロパティ取得時も設定時も同様に呼び出される。

また、lvalue サブルーチンへの代入によって、
フィールドに値が設定されるのは、
lvalue サブルーチンの外で行われるため、
代入される値を検証し、拒否することができない。

・書き込み専用のプロパティが作成できない。

通常のサブルーチンで実装した場合、
フィールドの値を戻り値とすることで、
読み取り専用のプロパティに近いものは実装できる。

しかし、代入ができるようにするためには、
lvalue を使う必要があるが、その場合、上述の通り
getter/setter の区別がなくなる。
つまり、書き込み専用のプロパティは実現できない。

書き込み専用のプロパティの代表例としては、
User クラスの password プロパティなどがある。
こういったプロパティは値が取得できないのが一般的だ。

さて、このような機能を補うにはどうすればいいか。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.