適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

挫折した人のためのVBAクラスモジュール入門_その6

この記事では

  • VBAのクラスモジュールの使い方を解説しています。
  • 前回に引き続き、シートの情報をクラスモジュールを使ってオブジェクト化していく手法を説明しています。
  • カプセル化の概念を説明しています。
  • この記事はクラスモジュールの実践的な使い方を学びたい人に向けて書いています。
  • シリーズものです。その1はこちら→挫折した人のためのVBAクラスモジュール入門_その1 - 適材適所

プロパティへのアクセスについて

前回はオブジェクトの内部プロパティへのアクセスについてのお話でした。

プロパティを設定する時は、Prorperty Let、取得する時はProrperty Getを使うという話でした。

そして、どうして内部のプロパティへ直接アクセスさせない方がいいか、アクセスさせない理由は、

  1. カプセル化する
  2. プロパティのインターフェースを統一する

ということでした。

まずは、カプセル化について私なりの解釈をお話しします。

カプセル化とは

カプセル化とは、オブジェクトの外部から操作させないことです。

・・・って、あれ?これって、その4でも語りましたね。

オブジェクトについて考えるときは、視点を変えることが大事です。 GodExcelオブジェクトからすると、自分以外=外部です。 GodExcelからすると、プロパティは自分の中の情報です。 例えれば プロパティはGodExcelオブジェクトの個人情報みたいなものですかね。 その個人情報は外部から勝手に覗かれては困ります。 個人情報を他人、つまり外部から自分の伺い知らないところで覗き見られてはたまらない、ということで、プロパティは基本的にPrivateにします。 Private に設定されたプロパティは外からいじることができません。

これが、よく言われるカプセル化です。

オブジェクトの個人情報を見せないようにする。

この個人情報に責任を持つのは、GodExcel自身なのです。だから、不用意に変更されたら困ってしまうのです。

カプセル化は抽象的な考えで、オブジェクト指向の中心的考えです。今回お話したカプセル化はプロパティのカプセル化についてです。

カプセル化の考え方は他の部分でも応用されます。

それは込み入った話になるので、おいおい別の記事で言及できれば・・・。

プロパティのインターフェースを統一する

次はインターフェースの統一です。

ここで言うインターフェースとは、操作のことだと思ってください。

あるオブジェクトについて、外部からプロパティの変更を許している、つまりあるプロパティについて、Property Letが定義されている場合に、予期せぬ値を設定されても困ります。

例えば、あるオブジェクトに2文字しか設定できないプロパティがあり、外部のプログラムが3文字以上の値を設定しようする場合を考えます。

そのオブジェクトの責任として、2文字しか設定できないプロパティの制約を守らせる必要があります。

この場合、Property Letの中で引数の文字数をチェックすることで、その責任を果たすことができます。

例えばこんな感じでオブジェクト自身にチェックさせることができます。

'SampleClass.cls

Private pTwoLetter As String

Public Property Let TwoLetter(aTwoLetter As String)
If aTwoLetter > 2 Then
aTwoLetter = Left$(aTwoLetter, 2)
Else
pTwoLetter = aTwoLetter
End If
End Property

このコードの場合、3文字以上の文字列が引数に与えられた場合、先頭の2文字をプロパティとします。

先頭の2文字を設定するか、エラーとするかなどは設計の話になります。

逆にプロパティがPublicな状態だとほとんど無秩序に値を設定できてしまします。

この例のように、プロパティの設定の過程で値チェックをすることで、予期せぬ値が入り込むことを予防することができるのです。

これがインターフェース、つまり操作を統一できるということであり、オブジェクト自身がプロパティへのアクセスを秩序立てることができるのです。

抽象的な話になってしまいました。

ちょっとおなか一杯です・・・。

次回はGodExcelの話に戻り、このオブジェクトを成長させていきたいと思います。

ここまでお読みいただきありがとうございました。

www.tekizai.net