デザインパターンとVBA

GoF(Gang of Four)のデザインパターンをVBAで実装したらブログのネタになるんじゃないか?と思って検索したら、すでに同じことを考える人がいる訳でして、あえなく挫折しましたorz

Excel VBAだけで作るデザインパターン – 9号研究室オンラインショップ –

https://booth.pm/ja/items/4084624

これは記事ではなく、本にして売っているという販売サイトです。もともとはコミケで売ったものだそうです。いまどきはコミケでこういう本を売るのですね。

人様がすでに記事に(本に)しているものを私が記事にしても仕方がないので、今日は私が知っている数少ないデザインパターンのうち、Singleton(あるクラスについて、インスタンスがユニークであることを保証するパターン)をVBAで実装した例をちょっとだけ紹介しておきます。

といっても私が考えた訳ではなく、Webの海にあったものを以前見つけて、重宝に使っているというだけの関係なんですが。

コード自体はこちらを見てください。

エラー処理でSingletonを使っています。

Public Sub SetError(ByVal mdlName As String, ByVal prcName As String)
    
    ' 最初のエラーを設定する(すでにセットされていたらセットしない)
    If moduleName = "" Then
        moduleName = mdlName
    End If
    If procName = "" Then
        procName = prcName
    End If

End Sub

私は最初この記事を読んだとき、当時はデザインパターンなんて全く知りませんでしたので、「なんてすごい発想だ」と感動したものでした。

VBAでエラー処理するときやっかいなのが、エラーが上書きされてしまうことです。

エラーが発生した場所(モジュール、関数)とエラーの内容が分からなければ正しい対処もできません。

そこでどうにかエラー処理をうまくできないかと模索していたときに出会ったのが、このサイトでした(再掲)。

このコードの何がすごいかというと、最初だけしかmoduleNameとprocNameに値をセットしないってことです。

当時作っていたツールにさっそく採用し、以来、エラー処理にはこのクラスモジュールを流用しています。

それから何年も経ってからJavaを学び、GoFという人たちを知り、デザインパターンのSingletonを学び、ようやく点と点がつながって線になった気がしました。

1回しかインスタンスを生成できないようにするのがSingletonの意図だとすると、正確にはこれはSingletonではないのかもしれません。しかし、1回しか値を代入できないってところが似ているナーと思い紹介しました。