やりたいこと
if分を使わずに入力(文字列)に応じて呼び出すメソッドを変える処理を書いたのですが、他の書き方に書き変えたいです。
できたこと
以下のような処理を実装することはできました。
python
1def win(): 2 return 'you win !' 3 4def lose(): 5 return 'you lose...' 6 7def draw(): 8 return 'draw game' 9 10 11# result が出るまで色々があるが、省略したものとする 12result = 'win' 13 14# if/else/elseを書きたくないので、代わりに辞書で処理させた 15method_dict = { 16 'win': win, 17 'lose': lose, 18 'draw': draw 19} 20 21method_dict.get('win')() 22=> 'you win !'
ここから先どうしたいか
method_dict.get('win')()
このメソッド呼び出し方が非常に醜く、一般的ではない書き方になっているように感じています。
もう少し初心者でもわかりやすい、もしくは一般的な書き方にできたらと思っているのですが、何か良いアイデアお持ちの方いらっしゃらないでしょうか.....?
補足
2回目ですが、if分を使わずに処理を書きたいです。
理由としては、私の書く処理が循環的複雑度(cyclomatic complexity)が高く、いつもLintツールに怒られているからです。
できるだけ循環的複雑度を抑えつつ、なるべく初心者でも理解できるような書き方にしたいです。
目指しているもの
- if文を使わない
- なるべく初心者でも理解しやすい
- 循環的複雑度が低くなるようにする
lambda関数とか使ったらもう少しわかりやすくなったりしないでしょうか....。
追記 (2021/01/02)
ご指摘やいくつかの回答のおかげで、具体的なソースがないと回答のしようがないことがわかりましたので、ソースコードのサンプルを掲載します。
※実際のコードではないので、そのまま実行しても動作しないかエラーになる可能性があります。
実際のコードは、各ファイルが数百行に及び、かなり可読性も低い状態のため、大幅に省略することにしました。
ソースの概要
- 以下にクラス図を示します
- 上記の図は以下の関係性を表しています
・CallerA has Manager
・CallerB has Manager
・Manager has ClientA and ClientB
・ManagerはFacadeのつもりです
・今回の質問とは関係ないですが、Managerは、ClientA, ClientBの処理結果を統合してCallerに返却する他のメソッドも多数持っています
上図のようなクラス設計にした理由(追記2回目)
クラス設計の理由を書いていなかったので解説します。
当初はCallerA, B...という複数のクラスが、各Clientを五月雨式に呼び出していました。
しかし、各Caller間で重複する処理が出てきたことや、可読性が大幅に低下したことがきっかけで、CallerとClientの間に中間クラス(Manager)を設けることを考えつきました。
※この中間クラスをFacadeなどと呼ぶこともあると知ったのはここ数日の話なので、もしかしたらこの呼称は間違っているかもしれません。
各クラスのソース
python
1# CallerA 2from manager import Manager 3 4 5class CallerA(): 6 def __init__(self): 7 self.manager = Manager() 8 9 def some_method(self): 10 self.manager.call_client('aaa', variable_a='a', variable_b='b') 11 return result 12# 以下略
python
1# CallerB 2from manager import Manager 3 4 5class CallerB(): 6 def __init__(self): 7 self.manager = Manager() 8 9 def some_method_a(self): 10 self.manager.call_client('aaa', variable_a='aa', variable_b='bb') 11 return result 12 13 def some_method_b(self): 14 self.manager.call_client('bbb') 15 return result 16 17 def some_method_c(self): 18 self.manager.call_client('ccc', variable_c='c') 19 return result 20# 以下略
python
1# Manager 2from clients.client_a import ClientA 3from clients.client_b import ClientB 4 5 6class Manager(): 7 def __init__(self): 8 self.client_a = ClientA() 9 self.client_b = ClientB() 10 11 def call_client(self, method, **kwargs): 12 method_dict = { 13 'aaa': self.client_a.return_a, 14 'bbb': self.client_b.return_b, 15 'ccc': self.return_c, 16 } 17 return method_dict.get(method)(**kwargs) 18 19 def return_c(self, variable_c): 20 # variable_c を使用する処理 21 c = .... 22 return c 23# 以下略
python
1# ClientA 2class ClientA(): 3 def __init__(self): 4 pass 5 6 def return_a(self, variable_a, variable_b): 7 # variable_a, variable_b を使用する処理 8 a = .... 9 return a 10# 以下略
python
1# ClientB 2class ClientB(): 3 def __init__(self): 4 pass 5 6 def return_b(self): 7 # 何らかの処理 8 b = .... 9 return b 10# 以下略
回答3件
あなたの回答
tips
プレビュー