vbscriptでクラスを考えてみる。①

スクリプトから勉強し始めの方に、クラスってなんで必要なのか?
クラスってどういう考え方なのか?を理解できるように考えてみる。

例えば – vbscriptの場合、こんな処理を考えてみる。

2つのテキストファイルを読み込む処理

スクリプトを勉強し始めると、最初の理解ではこの様なコードを考える。
で、このコードを実行してテキストの読み込み処理をしていると
そのうち、「あっ、ファイルがなかったからエラーになった」という場面にぶつかる。
なので、ファイルを読み込む処理の前にファイルの存在確認をしようってなる。
ファイルの存在確認の際にも「FileSystemObject」のインスタンスを使うことになる。

みたいな感じ。

こうやって、fsoを使いまわしていくと
どこでfsoを破棄(Set fso = Nothing)すればいいのかわからなくなってきちゃいます。
・・・そして、Nothingし忘れる。あるいは、Nothingしたあとでfsoを使おうとしてエラーになる。
なので、まずは Sub や Function を使って処理のルーチン化・ファンクション化することを考えるようになる。

とりあえず、機能を纏めてみる。

単純なファイル操作のスクリプトを書く分には、これでも全然大丈夫。
でも、実業務では、ここからさらにテキストへの書きこみ(上書き/追記)だったり
フォルダの作成・ファイルの削除など、「FileSystemObject」を使いまわす処理がたくさん出てきます。
すると、いろんな Sub や Function の中でいたるところでfsoの生成・破棄を繰り返す様になってしまいます。
そのくらいまで、いろいろやらなきゃいけないことが増えてきたときに便利な考え方がクラスになります。

Class ~ End Class の間では、Private Publicといった
クラスの中で宣言した関数やルーチン、ファンクションをどこまで公開するか?
という概念が備わっていて、クラスの中で使い回したりクラスを破棄することでクラスの中で使っていたリソースを一気に破棄することが簡単にできるようになっちゃうのです。

 vbscript Class の例

クラスclsTextのインスタンスからファイル操作を行うことで
「Set fso = CreateObject(“Scripting.FileSystemObject”)」の記述量をうんと削減できます。
テキストを読み込む場合

①.New clsText → clsTextのインスタンスを生成してます。
→ インスタンスが生成されると、「Private Sub Class_Initialize」が呼び出されてFileSystemObjectのインスタンスがfsoに入ります。
fsoは、Privateで宣言されているので、Classの外からは参照できず、
クラスの中のSub や Functionからのみ共有で使うことができます。

②.clsTxt.ReadText → clsTextのReadTextを実行してテキストの読み込みを行います。
①でfsoにFileSystemObjectを生成済みなので、余計な宣言がいらなくなってますね!
→ 何回でも呼び出して大丈夫!

③.Set clsTxt = Nothing → インスタンスを破棄してます。
→ インスタンスが破棄されると、「Private Sub Class_Terminate」が呼び出されて
fsoの破棄が行われます。
これで、Set fso = Nothing のタイミングを考えなくてもよくなりますね♪

こうやって、必要な処理を集約して、記述を纏めて、ブロック化することで
違う処理でまたスクリプトが必要になった時には、この Class ~ End Classをコピペで持って行って必要なファンクションだけ呼び出して使えば楽ちんになりますね♪

こうゆうのを、難しい参考書では「クラス化によってコードの再利用性を高める」なんて表現しています。
インスタンスごとに構造体としてデータを管理することで受けられる恩恵とか、他にもいいことはいろいろあるんですが、今日のところはこんなところで、またの機会にしましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です