君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

劇的ビフォ◯アフターで学ぶデザインパターン(strategy編:before)

このシリーズについて

このシリーズでは、

について、

仕様変更があった時、既存コードの書き換えがどれくらい発生するか?

という観点で比較し、デザインパターンのメリットをより感じましょ〜というシリーズです。

今回は、「strategy」パターンについてやっていきます。

作戦を変えて戦う勇者クラス

f:id:karoten512:20171021132629j:plain

ドラゴンク◯ストは関係ありません。

作戦を変えて戦う勇者クラスがあったとします。

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パターンを適用してみます。