t-hom’s diary

主にVBAネタを扱っているブログです。

コードリーディング(Ariawase)

さて、今日は色々なところで紹介されているVBAのスーパーライブラリAriawaseについて。

Ariawaseについて知らないVBA使いの方は、こちらに詳しく解説されているので参照されたし。
※2015年8月現在、参照先が消滅しました。Ariawaseについてはネット検索等で調べてください。

私はAriawaseのAssert.basでTDDをしたいと思ったが、その前にテスト技法をちゃんと勉強してないのでもうしばらくお預けである。

テストについてはよく分かっていないが、以下のどちらかに手を出そうかと迷っている。

【この1冊でよくわかる】ソフトウェアテストの教科書―品質を決定づけるテスト工程の基本と実践

【この1冊でよくわかる】ソフトウェアテストの教科書―品質を決定づけるテスト工程の基本と実践

昨日もあと少しで買いそうなところでジュンク堂が営業終了になった。
まぁでも、今のところ個人ではUnitTestくらいしかしないと思うので、同値分割と境界値分析だけネットで調べれば間に合う気もする。


さて、Ariawaseを使う代わりに、Ariawaseそのもののコードを読むことにした。
まずは縁の下の力持ちCore.basから。

読み始めて早速、VB7.DLL・VB6.DLLの関数「rtcCallByName」がDeclareされている。
何だろうかとコード内を検索してみると、Core.bas内ではInit関数からのみ呼び出されていた。
じゃあInit関数は何なんだと検索してみると、どうやらオブジェクトとパラメーターを引数に取って、そのオブジェクトの、これまたInitという名前のメソッドを呼び出しているらしい。

たとえばMonkeyTest.clsでは次のような形でInitが使われている。

Set Tuple2Of = Init(New Tuple, itm1, itm2)

これで、TupleのInitメソッドが引数2つで呼ばれる。

これはまさか!
そう、前回私が悩んだClass_Initializeへ引数を渡す処理の答えである。

Init関数という形でInitializeに引数を渡し、戻り値はそのオブジェクトなので、そのまま使える。
つまり、前の記事で以下のように書いていたものを、

Dim x As New SampleClass
x.Init ("あいうえお")

このように書き換えられるということか。

Dim x As SampleClass
Set x = Init(New SampleClass, "あいうえお")

前者と比べてコードは長くなっているが、こちらの方がコンストラクタとしての完成度が高い。
なぜなら前者はインスタンスの生成と初期化が2文に分離しているが、後者はインスタンスの生成と初期化を1文で行っているからである。
※後者のDim文はSampleClass型変数の準備であって、インスタンスの生成は2行目のNew SampleClassである。Init関数に包まれた全体をインスタンス生成と見做せば、これは引数付きのコンストラクタに等しい。

優れたコードからは学ぶことが多い。
また何日かかけてAriawaseのコードを読んでいこうと思う。

ちなみに、先日から学習を始めたデザインパターンは本日まだ1/4くらい。Youtubeで解説動画なども参考にしながらぼちぼち進めている。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。