劇的ビフォ◯アフターで学ぶデザインパターン(strategy編:before)
このシリーズについて
このシリーズでは、
について、
「仕様変更があった時、既存コードの書き換えがどれくらい発生するか?」
という観点で比較し、デザインパターンのメリットをより感じましょ〜というシリーズです。
今回は、「strategy」パターンについてやっていきます。
作戦を変えて戦う勇者クラス
ドラゴンク◯ストは関係ありません。
作戦を変えて戦う勇者クラスがあったとします。
class Hero attr_accessor :strategy_code # ガンガンいこうぜ STRATEGY_CODE_GANGAN = 0 # じゅもんつかうな STRATEGY_CODE_DONT_USE_JUMON = 1 # いのちだいじに STRATEGY_CODE_INOCHI_DAIJINI = 2 def initialize(strategy_code = STRATEGY_CODE_GANGAN) # 引数が渡ってきていない場合、デフォルトでガンガンいこうぜ @strategy_code = strategy_code end # 攻撃させる def action if strategy_code == STRATEGY_CODE_GANGAN # 攻撃魔法のみつかう puts 'こうげきまほうをつかった!' elsif strategy_code == STRATEGY_CODE_DONT_USE_JUMON # 通常攻撃のみ puts 'ふつうにこうげきした!' elsif strategy_code == STRATEGY_CODE_INOCHI_DAIJINI # 回復魔法のみつかう puts 'かいふくまほうをつかった!' end end # ガンガンいこうぜに切り替え def change_strategy_gangan @strategy_code = STRATEGY_CODE_GANGAN end # じゅもんつかうなに切り替え def change_strategy_dont_use_jumon @strategy_code = STRATEGY_CODE_DONT_USE_JUMON end # いのちだいじにに切り替え def change_strategy_inochi_daijini @strategy_code = STRATEGY_CODE_INOCHI_DAIJINI end end
クラスの利用側
hero = Hero.new
hero.action
hero.change_strategy_dont_use_jumon
hero.action
hero.change_strategy_inochi_daijini
hero.action
結果
こうげきまほうをつかった! ふつうにこうげきした! かいふくまほうをつかった!
仕様変更
上司
「ガンガンいこうぜ だと死ぬこともあるからさ、
適度に回復してくれる『バッチリがんばれ』を作戦に追加な」
えぇ〜。
。。。このとき想定される変更箇所は、
class Hero attr_accessor :strategy_code # ガンガンいこうぜ STRATEGY_CODE_GANGAN = 0 # じゅもんつかうな STRATEGY_CODE_DONT_USE_JUMON = 1 # いのちだいじに STRATEGY_CODE_INOCHI_DAIJINI = 2 ############### 1. 作戦コードの追加 ############### def initialize(strategy_code = STRATEGY_CODE_GANGAN) # 引数が渡ってきていない場合、デフォルトでガンガンいこうぜ @strategy_code = strategy_code end # 挨拶をさせる def action if strategy_code == STRATEGY_CODE_GANGAN # 攻撃魔法のみつかう puts 'こうげきまほうをつかった!' elsif strategy_code == STRATEGY_CODE_DONT_USE_JUMON # 通常攻撃のみ puts 'ふつうにこうげきした!' elsif strategy_code == STRATEGY_CODE_INOCHI_DAIJINI # 回復魔法のみつかう puts 'かいふくまほうをつかった!' end ############### 2. 作戦分岐の追加 ############### end # ガンガンいこうぜに切り替え def change_strategy_gangan @strategy_code = STRATEGY_CODE_GANGAN end # ガンガンいこうぜに切り替え def change_strategy_dont_use_jumon @strategy_code = STRATEGY_CODE_DONT_USE_JUMON end # ガンガンいこうぜに切り替え def change_strategy_inochi_daijini @strategy_code = STRATEGY_CODE_INOCHI_DAIJINI end ############### 3. 作戦切り替えの追加 ############### end
3箇所変更の必要があります。
基本的に既存のソースコードを変更は少ないほど良いです。
(規模によっては既存ソースコードの編集はリスクになるから)
このまま追加すると、条件分岐の数が増えてごちゃごちゃしそうです。。。
そこでstrategyパターン
このように、オブジェクトがいくつかの戦略をもち、それを切り替えて使いたいときは、
strategyパターンが有効です。
本当に有効なのか?ということで次回、strategyパターンを適用してみます。