Enumの研究(1)

Enumの研究(1)

コードの可読性を上げる一つの方法として、

Enumを適切に使う

というものがある。

ずいぶん前からEnum自体は使っていたが、最近やっと適切な使い方が定まってきたように思うので、Enumについていろいろ実験したことを書き留めておく。

Enumの要素名がuniqueであるとき

長らく勘違いしていたのだが、Enumの要素名がuniqueである場合、定数のように単独で使うことができる。

なんでこんな簡単なことに気付かなかったのかというと、入門書とかに「xlContinuous」の類のことが、

組み込み定数

と書いてあるのが原因だと思う。

Microsoftのリファレンスを検索したら、たとえば先の「xlContinuous」の場合、「XlLinStyle列挙体」とちゃんと書いてある。

xlContinuous」を「XlLineStyle.xlContinuous」と書かなくてもよいのだから、自作のEnumだって要素名だけで定数のように使えるのは当り前なのだ。

リスト1 標準モジュール宣言セクション
Public Enum Hoge
  firstElement = 2
  secondElement
  thirdElement
  fourthElement
  fifthElement
End Enum

たとえば、このようにEnumを作る。

で、イミディエイト・ウインドウに

?firstElement

と打ち込んで、[Enter]を押すと、

f:id:akashi_keirin:20190324145646j:plain

このように、「2」が出力される。

ちゃんと、「2」を意味する定数として働いていることがわかる。

Enumの要素名が衝突しているとき

では、Enumの要素名が他のEnumの要素名と衝突していたらどうなるのだろうか。

スト2 標準モジュール宣言セクション
Public Enum Hoge
  firstElement = 2
  secondElement
  thirdElement
  fourthElement
  fifthElement
End Enum

Public Enum Foobar
  firstElement = 3
  secondElement
  thirdElement
  fourthElement
  fifthElement
End Enum

ご覧のように、新しいEnumFoobar」を作成し、先の「Hoge」とほぼ同じ要素を持たせてみる。

このようにした上で、イミディエイト・ウインドウに先ほどと同じく

?firstElement

と打ち込んで[Enter]。

f:id:akashi_keirin:20190324145649j:plain

firstElement」だけでは、EnumHoge」の「firstElement」なんだかEnumFoobar」の「firstElement」なんだか、コードを打ち込んだ本人にもわからないのだから、当然こうなる。

もちろん、たとえば

?Foobar.firstElement

としてやれば、

f:id:akashi_keirin:20190324145654j:plain

このように意図したとおりの結果は得られる。しかし、いちいちEnum名を指定しないといけないのではめんどくさいことこの上ない。

ひとまずのまとめ

ここまでをまとめると、

Enumの要素名はuniqueにすべし!

ということになる。

要素名の衝突を防ぐために、本家Microsoft Officeシリーズでは、

要素名に接頭辞を付ける

という対策をとっている。

これを真似しない手はない。

そこで、最近は、

要素名の先頭にEnum名の略語を添える

というやり方をしている。

たとえば、先のEnumHoge」、「Foobar」なら、次のようにするのである。

リスト3 標準モジュール宣言セクション
Public Enum Hoge
  hgFirstElement = 2
  hgSecondElement
  hgThirdElement
  hgFourthElement
  hgFifthElement
End Enum

Public Enum Foobar
  fbFirstElement = 3
  fbSecondElement
  fbThirdElement
  fbFourthElement
  fbFifthElement
End Enum

これだけのことで、uniqueなEnum要素名が作りやすくなる。

今回はアホみたいなEnum名なので実感しにくいが、Enum名を役割明示的にして、略語もわかりやすいものにしておけば、コーディングが非常に楽になる。

おわりに

過去に書いたコードを見直してみて、Enumの使い方が我ながらめちゃくちゃだったので、書いてみました。

お役に立てれば幸いです。