サンプルをみて「で、こんなことができて何のトクがあるの?」と感じる方もいらっしゃるだろう。


たとえばこんな用途。

事務手続きの決まっているもの、そう、たとえば定型的な書類が複数あり、データベースから選択して決裁/印刷したい場合なんかはどうでしょう。

共通部分は処理の流れになる。起票、押印、決裁、しかるべき提出先へ提出、といったところでしょうか。電子化されているなら、例えば雛形選択、情報付記&登録、電子押印、電子決済、印刷と送付先ラベルシール印刷、というように置き換えられるとします。

相違部分は雛形が違えば、起票内容、決裁先、送付先、そもそもの帳票フォーマット、などがあります。

(今朝歯磨きしながら思いついた例で、電子決済なんか考えるとちょっと規模が大きくなりますが、そこのところは寛大に・・)


ポリフォーフィズムを使えば「相違部分をオブジェクト化し、共通部分を使い回す基本ロジックに」と整理できます。


さて、ダウンロードできるようにしたサンプルで、オプションボタンではなく、通常のボタンを3つにしたならどうだろう。それぞれのボタンイベント内でオブジェクトを指定することになるので、イベント内からIf文が消える、ということになります。構造化プログラミングでいうところの、順次、分岐、反復のうち、分岐が減らせることになるということです。

このことは、たとえば4つ目を追加した場合の従来ロジックへの影響度を考えますと、分岐のあるオプションボタン方式だと分岐を追加するので一通り従来の分もテストする必要がありますが、通常のボタン追加方式だと従来のロジックを変更するわけではないので追加分のテストのみですむことになります。


このあたり、インターフェースとの兼ね合いもあったりと、必ずしも後者でなければというつもりはありませんが、設計時の考慮点として知っておいて損はないかなと思います。



※書き直し /八月末削除予定 /クラスモジュール応用

ファイルをアップできないようなので、公開用サイトを使うことにした。


Excel2003で作成したが、Excel2000以上なら大丈夫だと思う。

悪意あるコードは含めていないが、不具合が起こっても賠償は致しかねます。


渡すクラスを変えれば内容が変わる、という例です。


オプションボタンを選んでボタンをクリックすると、くだらない結果が返ってきます。

ソースコードでどうやっているかを確認してください。


ClassファイルをObject型にSetしていますが、クラスを汎用的に使う場合にObject型にします。もちろん、ここではこのクラスしか使わない、というなら型を指定しますが、ポリフォーフィズムのサンプルなので・・。


ダウンロード先 

  http://pub.idisk-just.com/fview/1fFbn0IXK98kQJvVsTolth0eFY4en-j3_OTrt0F9l-Q-XDk3npJgy5kCOVVVsjpOR27IJdmRsJVF9yNXSx5URQ

ダウンロードファイル

  SmpleCode_20061023.xls






※書き直し /八月末削除予定 /クラスモジュール応用

 
クラスモジュールの特徴を挙げ、標準モジュールとの差異を比べてみましょう。

【明示的に使える状態にしてやらないと使用できない】

標準モジュールのプロシージャや関数は記載しておけば使えます。しかし、クラスモジュールで書かれていることは「明示的に使える状態にしてやらないといけない」ということです。

VBAは基本的にローカルコンピュータで動作するので意識することはないですが、サーバーや汎用機で稼働するプログラムの場合、同時に同じプログラムが呼び出されることはあります。その際のサーバー上の資源を節約するための手法くらいに考えて頂ければと思います。(これではちょっと説明不足ですが・・)


クラスモジュールは、Newで生成されます。前回の例では変数定義時にNewキーワードを使っていましたが、一般的には変数定義時にはNewを使わず、利用時に必要に応じて生成します。

Dim C As Class1 '前回からNewを省いた形


Set C = New Class1  'このように Set でクラスを生成する。


使い終わったらクラスを破棄しましょう。


Set C = Nothing  'このように Set でクラスを亡き者にしてしまう。


これがクラスモジュールのライフサイクルです。一度破棄したら二度と使えない訳ではなく、再利用が可能です。



【Publicなプロシージャや関数でも同じ名前が使える】

標準モジュールではPublicにすると名前が一意になるように気を付けなければいけません。が、クラスファイルでは前方に修飾子が付くので、同じプロシージャ名、関数名が使えます。


【同じものを複数生成できる】

処理を複数生成してもあまり意味はないかもしれませんが、データ群を複数生成したくなることはありませんか?

例えばフォーム1とフォーム2で同様のデータ群を持つなら、定義は1つにしたいものです。

また、状態によって「現在フォームに出して操作している値」と「直前の状態」を持つにも、定義は1つにできるといいですね。

そういう際、

Dim C1 As New Class1

Dim C2 As New Class1

などと、複数生成でき、もちろんお互いの内容は独立しています。


私がよく使うのはオリジナルのデータ型をクラスで定義しています。

2次元のテーブルでStringとLongを混ぜ、ある項目に値が入れば計算結果を別の項目に設定などをしたります。

もう少し洗練して、場合によってはエラーも返すインテリジェントなデータ型(と勝手に呼んでいる)も実験的に作ったりしています。



【ポリフォーフィズムを使える】

Publicなプロシージャや関数でも同じ名前にしておくことが前提ですが、ポリフォーフィズムを使えます。

オブジェクト指向言語を体験していないと聞き慣れない言葉でしょう。

通常、処理の流れが同じでも類似したことは別のロジックが必要です。人によっては流れは同じだからと、処理の途中途中にIF文を入れていく人もいるでしょう。

これを「オブジェクトを切り替えることで処理の流れを共有する」という技が使えます。


おそらく「はぁ?」って感覚でしょう。従来の考え方とは180度考え方が違うので、ここだけで説明をできないでしょう。

今回はJavaのものですが、参考書籍を挙げておくことにします。

 
オブジェクト脳のつくり方 (CD-ROM付)
¥2,800
株式会社 ビーケーワン


いずれExcelVBAでのサンプルプログラムを作って体験していただこうと思います。



※書き直し /八月末削除予定 /クラスモジュール基礎