20240410 エクセルVBAクラス備忘録 クラス隠蔽(カプセル化)
エクセルVBA オブジェクト指向備忘録クラス クラス隠蔽(カプセル化)~PrivateとPublic~
<前書き>
エクセルVBAオブジェクト指向、初心者です。
VBA自体は、以前から使用していました。
オブジェクト指向というものがあることは、知っていましたが、ネットなどを見てもよく分からず、挫折した過去あり。
<以上前書き>
今回も、コードもない、ぼんやりとした疑問です。
(解決してません。実践で試すしかないかな・・・。)
VBAで(も)、下記のような、クラス内で使用するセッターやゲッターがある。
(例)
Private mItem番号 As long
'let
Public Property Let Item番号(pItem番号 As long)
mItem番号 = pItem番号
End Property
'get
Public Property Get Item番号() As long
Item番号 = mItem番号
End Property
例では、
「Private mItem番号 As long」
というように、Private変数にしている。
(注:mはメンバー変数(private)の略。勝手につけてます。)
他方、Publicで済ます手もある。
「Public Item番号 As long」
こう(Public)すれば、クラスの呼び出し元から直接アクセスできると言うが・・・。
(それが危険と言うが・・・)
Private変数を使っても、セッターを使えば同じでないの?と思ってしまう。
(それどころか、プライベート変数が増えてしまうし・・・メモリ食う???)
***********************************
少し、道をそれるけど、オブジェクト指向(クラス使用)でなく、「手続き型」で作成する場合、
Private変数ばかりで、Public変数は、どうしても仕方ない場合しか使わなかった。
(複数のユーザーフォームで、同じ配列データをリストとして使う場合など、他に思いつかず仕方なく当時使った。)
Private変数しか使わない理由は、他のプログラムに影響が出るのが怖いから。
他の人が使う場合、複数のブックを同時に開いていたり、想定しないことを起こす場合がある。
(外部のブックにまで、影響したり、影響されたりするかは分からないが・・・。)
変数の宣言位置や、スコープを考えればいいのだろうけど、面倒なので、Private変数しか使わないと決めていた。
********************************
で、オブジェクト指向の場合、どうすればいいか?
上でも書いたように、セッターを使えば、public変数として使えるんでは?
と思ってしまう。
対策とすれば、
Public Property Let Item番号(pItem番号 As long)
mItem番号 = pItem番号
End Property
の内部に、条件処理を入れて、使用場面を限定するとか
(例:元から数字があれば書き換え不可のif文など。)。
また、クラスはインスタンス化しないと使えないから、インスタンス化して、変数を使うので、そうそう誤作動は起こさないのでは?という気もしている。
============================
素人なのですみません。
自分が恐れているのは、
外部のブックから影響を受けることはないのか?
(自分のデータベースが、外部ブックのシートデータを間違って転記、書き換えるとか)
また
外部のブックに影響を与えることないのか?
(外部ブックのシートに、書き込んでしまうとか)
ということです。
まあ、具体的に、ブックを指定したり、コードを注意すればいい、別の問題という気もしますが。
+++++++++++++++++++++++++
クラスの隠ぺい(カプセル化)には、クラスのフィールドを直接触らせたくないということもあるそうです。
もっと、クラスを書いてみないと、よく意味は分かりませんが。
+++++++++++++++++++++++++
あと、セッターから考えると、何で、こんなプロパティいるのと考えてしまうが、
もしかしたら、ゲッターしかないクラスがあった場合、このクラスは、取り出ししかできないから、
完全に守られているのかも。
そう考えると、セッターとゲッターは対(ワンセット)でなくてもいいのかも・・・。
追記:また、後日、もやもやとしたことを書くことになるが、オブジェクト指向とエクセルはもしかしたらすごく相性がいいのかも・・・と先日思った。