2024/05/17

クラス化に挑戦: #3)クラスとスコープ

前回はクラスの定義方法をまとめました。ただ、構造の解説を主題にしたので、割愛した部分があります。それが今回のテーマのスコープです。

スコープに関しては別の記事『変数や関数の宣言とスコープ』にまとめました。この記事では変数や関数に関して記載しましたが、ユーザ定義クラスも関係します。どのような動作になるのか順に確認しましょう。


ライブラリの準備

今回はよりスコープを意識できるよう、クラスはスクリプトライブラリに作成し、エージェントで利用する前提とします。

まずは、前回作成したクラスをスクリプトライブラリ lsClsSample に移動します。

続いてエージェントでこのライブラリを読み込み、前回と同様にクラスを利用してみます。すると、オブジェクト変数の宣言でエラーが発生し、クラスが利用できません。

このエラーの原因がスコープです。

ライブラリの最初に Option Declare を宣言していました。これが原因で Employee クラスは Private 扱いとなり、ライブラリ外では使用できなくなっていました。クラスを Public 宣言するとこのエラーは回避できます。

Public Class Employee

この対応で前回と同等の状態に戻りました。


プロパティやメソッドとスコープ

ライブラリに戻りプロパティやメソッドを確認すると各エントリに黄色い ■ アイコンが表示されています。

これは Private を表すアイコンのはずなのですが、エージェントから参照でき、利用もできます。これが、仕様なのかバグなのかはわからないのですが、不明瞭なので省略しない方がよさそうです。

プロパティやメソッド、メンバ変数でスコープをきちっと宣言すると次のようなプログラムになります。

Option Declare

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

   Public Function GetAge() As Integer
      Dim iAge As Integer

      ' 現在日付と誕生日(zvBD)から年齢を計算
      iAge = xGetAge(Today)

      GetAge = iAge '戻り値をセット
   End Function

   Private Function xGetAge(vvBase As Variant) As Integer
      Dim iAge As Integer
      Dim v As Variant

      ' 誕生日(zvBD)から基準日時点の年齢を計算
      iAge = Year(vvBase) - Year(zvBD)
      v = DateNumber(Year(zvBD), Month(vvBase), Day(vvBase))
      If zvBD > v Then
         iAge = iAge - 1
      End If

      xGetAge = iAge '戻り値をセット
   End Function
End Class

また、上記コードでは GetAge メソッドが動作するようにしています。

引数で指定した日付から年齢を計算する関数 xGetAge を追加しました。この関数はクラス内だけで使用するので Private 宣言をしています。このように明示的に宣言することでクラスのインターフェースとしたいプロパティやメソッドを明確にできます。

この対応で、デザイナーの表示も正しくなり視覚的にもインターフェースが明確になりますね。

ライブラリを利用するエージェントからは Private な関数にはアクセスできません。インターフェースを明確にすることで、安全で安心なクラスが構築できますね。


前回 クラス化に挑戦 次回


0 件のコメント:

コメントを投稿