個人情報を扱うプログラムを作成しているといつも悩むのが性別をプログラム内部で扱う際のデータ型だ。
文字列型で"男"・"女"としたり、Int型で1・2とするやり方もあるが、これだと他にいろんな値を取りうるので、バグの元になりかねない。
そこで2値をとるBooleanをつかうという選択肢を考えるのだが、、、
どうも男女をTrueとFalseで表すのは気が引ける。
まあ、アメリカじゃあるまいしプログラムの内部実装ごときで「男女差別だ」などと訴えられたりはしないだろう。
それでも、男が真(True)で女が偽(False)とか、感じが悪いではないか。
逆にしたらしたで、フェミニストを気取っているみたいで嫌だ。
それで考えたのが列挙型の使用である。
宣言セクションで次のように定義する。
Enum 性別 男 女 End Enum
そして変数を性別型で宣言すると、代入ステートメントの記入時に自動で「定数の一覧」が表示される。(下図)
列挙型を引数にとるプロシージャも作成してみた。
これは、私がときどき行くスパワールドのフロア案内をシミュレートしたもの。
偶数月と奇数月で男女のフロアが入れ替わる。
Sub フロア案内(Gender As 性別) Select Case Gender Case 男 If Month(Now) Mod 2 = 0 Then MsgBox "4階でございます" Else MsgBox "6階でございます" End If Case 女 If Month(Now) Mod 2 = 0 Then MsgBox "6階でございます" Else MsgBox "4階でございます" End If End Select End Sub
これも呼び出し時に定数の一覧が表示される。
今回は性別型で変数を作っているので、そのまま変数を渡した。
Sub test() Dim a As 性別 a = 男 フロア案内 a End Sub
すると、「6階でございます」と表示される。
列挙型は何も値を書かない場合は0から始まる連続したLong型になる。
したがって内部では男は0、女は1という値なのであるが、列挙型を直接やりとりすることで、内部の数値を意識しなくてよくなる。
性別型の宣言部に具体的な値を設定しても、順番を入れ替えても、メインコードには何も影響を与えない。
昨今では性別の在り方も多様化しているが、列挙型ならいくつでも定義できるのでその点でもBooleanより優れている。
近い将来、プログラムで男女以外の性別を扱うのがふつうになる日が来るかもしれない。
そうでなくても、こうしたテクニックはいろいろと使いまわしがきくので、覚えておくと良いと思う。