switch は書けないし、とはいえ if else はカッコ悪くて書きたくない!
C++を普段使っている人が遭遇しやすい状況かなと思います。
そう思う人も、そう思わない人も、まずは例を挙げてみますね。
if else によるカッコ悪い分岐
qiita.py
from enum import Enum
class Color( Enum ):
R = 0
G = 1
B = 2
def callback_r():
print( "callback_r" )
pass
def callback_g():
print( "callback_g" )
pass
def callback_b():
print( "callback_b" )
pass
def callback_default():
print( "callback_default" )
pass
def switcher( color ):
if color == Color.R:
callback_r()
elif color == Color.G:
callback_g()
elif color == Color.B:
callback_b()
else:
callback_default()
教科書通りのコードですが、これを書いてみていやな感じがしました。
どうにも冗長性を排除できず、バグが入り込む余地を多分に残しているように思えます。
switcher メソッドに少し手を加えてみます。
関数テーブルを用いたシステマティックな分岐
qiita.py
def switcher( color ):
tbl = {}
tbl[ Color.R ] = callback_r
tbl[ Color.G ] = callback_g
tbl[ Color.B ] = callback_b
for c in Color:
if c == color:
return tbl[ c ]
return callback_default
分岐の条件になるキーと、実行されるべきメソッドが必ず1対1となるような構造に変更しました。
これは分岐処理の途中で関係のないコード片を挿入される心配が一切ないことを意味します。
また間違ったメソッドが対応付けされていたとしても関数テーブルを定義しているコードブロックを確認すればすぐに気づくことができます。