Enumの名前の重なり

Enumの名前の重なり

VBAEnumを使い始めの頃、その当時はPublicPrivateの使い分けがいい加減だったこともあり、ずいぶん名前の重なりに苦労した。

そこで、最近は列挙体名、要素名それぞれにシンプルなルールに基づいて接頭辞を付け、極力重複が発生しないようにしている。

akashi-keirin.hatenablog.com

しかし、ふと思った。「Privateの場合はどうなんだ……?」。

やってみた。

まったく同じEnumを二つのモジュールに搭載する

読んで字の如し。まったく同じEnumを二つのモジュールに搭載し、それぞれそのEnumを利用するメソッドも搭載してみた。

リスト1 標準モジュール M02Sub1
Option Explicit

Private Enum Hoge
  aho
  boke
  kasu
End Enum

Public Sub showMessage()
  Dim msg As String
  msg = getMessage(aho)
  Call MsgBox(msg)
End Sub

Private Function getMessage( _
             ByVal msgCode As Hoge) As String
  Dim ret As String
  Select Case msgCode
    Case aho:  ret = "アホ1号"
    Case boke: ret = "ボケ1号"
    Case kasu: ret = "カス1号"
  End Select
  getMessage = ret
End Function
スト2 標準モジュール M03Sub2
Option Explicit

Private Enum Hoge
  aho
  boke
  kasu
End Enum

Public Sub showMessage()
  Dim msg As String
  msg = getMessage(aho)
  Call MsgBox(msg)
End Sub

Private Function getMessage( _
             ByVal msgCode As Hoge) As String
  Dim ret As String
  Select Case msgCode
    Case aho:  ret = "アホ2号"
    Case boke: ret = "ボケ2号"
    Case kasu: ret = "カス2号"
  End Select
  getMessage = ret
End Function

見ての通り、ほぼ全く同じモジュールの内容。

異なるのはそれぞれのgetMessageの返り値の設定部分のみ。

使ってみる

それぞれのモジュールを利用するコードを次のように書く。

リスト3 標準モジュール M01Main
Option Explicit

Private Sub test()
  Call M02Sub1.showMessage
  Call M03Sub2.showMessage
End Sub

ご覧のように、それぞれのモジュール(標準モジュールM02Sub1M03Sub2)のshowMessageメソッドを呼び出しているだけ。

同じ名前のメソッドでも、モジュール名から指定すればコンパイルエラーにならずに呼び出すことができる。

参考

akashi-keirin.hatenablog.com

実行結果

f:id:akashi_keirin:20190827063756g:plain

当然こうなる。何の問題もない。

おわりに

以上述べたとおり、PrivateEnumにおいては、名前の重なりとか全然気にしなくてもよい……と言いたいところなのだが、

f:id:akashi_keirin:20190827063808g:plain

この挙動を見ていると、やはり列挙体名の方はともかく、要素名は接頭辞を付けるなどして独自のものにした方が良さそうだ。

それにしても、なぜ「name」だとコンパイルエラーになって「value」とか「address」ならオッケーなのだろう……?