2024/05/19

クラス化に挑戦: #4)Property の役割

今回は Property ステートメントを使用したプロパティの作成について補足します。


プロパティとメンバ変数

前回作成したクラスの Birthday というプロパティに関連する部分だけを抽出すると以下の通りとなります。

Public Class Employee
   Private zvBD As Variant

   Public Property Get Birthday As Variant
      Birthday = zvBD
   End Property
   Public Property Set Birthday As Variant
      zvBD = Birthday
   End Property
   ・・・
End Class

この事例のようにメンバ変数の値をプロパティとして受け渡しするだけでいいのであれば、別の記述方法があります。メンバ変数 Birthday を Public で宣言するだけです。

Public Class Employee
   Public Birthday As Variant
   ・・・
End Class

Public なメンバ変数はクラス外からアクセスできます。コーディングの際はタイプアヘッドで表示されますので、プロパティと同等に利用できます。違いはアイコンがプロパティを表す ◆ ではないことぐらいですね。


Property ステートメントの役割

では、Property ステートメントは無用かというと、そんなことはありません。主に2つの役割があると考えます。

1つ目がアクセスの制限です。Property Get でインスタンスからの値の取得、Property Set でインスタンスに値を設定できます。両方を記述すると入出力双方向のアクセスが可能となり、片方だけ記述すれば一方通行のプロパティが作成できます。

2つ目は入力チェックです。

例えば今回の Birthday プロパティがとりうる値が過去の日付値であることが条件だったとします。この判定を実現したサンプルコードは次の通りです。

   Public Property Set Birthday As Variant
      On Error GoTo Proc_Err

      '入力チェック
      If IsDate(CStr(Birthday)) = False Then Exit Property
      If (Birthday < Today) = False Then Exit Property

      'メンバ変数にセット
      zvBD = Birthday

Proc_Exit:
      Exit Property

Proc_Err:
      'エラー発生時はメンバ変数を操作せずに終了
      Resume Proc_Exit
   End Property

このプロパティは日付値であることから Variant 型となっています。Variant は日付値に限らず数値や文字列などさまざまな値、場合によってはオブジェクトまでセットできてしまいます。まずは、これら異常値を排除する必要があります。

そこで、入力チェックの最初の処理として、入力値を文字列に変換して、それを日付型に戻せるか確認しています。

      If IsDate(CStr(Birthday)) = False Then Exit Property

文字列など日付型でない値では、この If 文で Exit されます。また、値がオブジェクトの場合は文字列に変換しようとした時点でエラーとなるので、エラー処理にジャンプした後 Exit します。

この判定を抜けた場合は日付値となります。安心して日付のチェック行い、プロパティとして受け付けてよい値か判定します。すべて問題なければ、メンバ変数に代入して値を保持させています。


まとめ

メンバ変数を Public 化するのとは違い、Property ステートメントを使用すると ”処理” を記述できます。

Set では、入力値チェックをはじめ、小文字 ⇔ 大文字や全角 ⇔ 半角変換を行い、値を整える処理を入れることができます。フォームのフィールドの『入力の確認』や『入力の変換』のような処理が記述できるということですね。

Get の場合は、メンバ変数を加工して出力したい場合に活用できます。


前回 クラス化に挑戦 次回


0 件のコメント:

コメントを投稿