Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

書籍 リファクタリング−プログラマーの体質改善 | メソッド呼び出しの単純化 | メソッドによる引数の置き換え

内容

リファクタリング

メソッドによる引数の置き換え

適用ケース要約

あるオブジェクトがメソッドを呼び出し、その戻り値を別のメソッドの引数として渡している。受信側は、そのメソッドを呼び出させる

適用内容要約

引数を削除し、受信側にそのメソッドを呼び出させる

適用詳細

あるメソッドに引数として指定されている値が別のメソッドの戻り値だった場合、
メソッド内へ移動することが可能ならば移動を行い、引数を削除することが出来る。

サンプル

あるゲームで攻撃を行った場合を想定します。
基本ダメージは力*武器の攻撃力とします
攻撃ダメージは基本ダメージから相手の防御力を引いたものとします。

サンプルコード

リファクタリング

# encoding: Shift_JIS

class DamageCalculator
  attr:player,:enemy
  
  def initialize(player,enemy)
    @player=player
    @enemy=enemy
  end
  
  def calculate_damage()
    base_damage=player.strength+player.weapon
    attack_damage=get_attack_damage(base_damage)
  end
  
  private
  def get_attack_damage(base_damage)
    return base_damage-enemy.defence
  end
end

class Character
  attr_accessor:strength,:weapon,:defence
  def initialize(strength,weapon,defence)
    @strength=strength
    @weapon=weapon
    @defence=defence
  end
end

player=Character.new(10,100,50)
enemy=Character.new(50,20,30)

damage_calculator=DamageCalculator.new(player,enemy)
puts "ダメージは#{damage_calculator.calculate_damage}"
damage_calculator=DamageCalculator.new(enemy,player)
puts "ダメージは#{damage_calculator.calculate_damage}"

リファクタリング

# encoding: Shift_JIS

class DamageCalculator
  attr:player,:enemy
  
  def initialize(player,enemy)
    @player=player
    @enemy=enemy
  end
  
  def calculate_damage()
    attack_damage=get_attack_damage
  end
  
  private
  def get_attack_damage()
    return get_base_damage-enemy.defence
  end
  
  private
  def get_base_damage()
    return player.strength+player.weapon
  end
end

class Character
  attr_accessor:strength,:weapon,:defence
  def initialize(strength,weapon,defence)
    @strength=strength
    @weapon=weapon
    @defence=defence
  end
end

player=Character.new(10,100,50)
enemy=Character.new(50,20,30)

damage_calculator=DamageCalculator.new(player,enemy)
puts "ダメージは#{damage_calculator.calculate_damage}"
damage_calculator=DamageCalculator.new(enemy,player)
puts "ダメージは#{damage_calculator.calculate_damage}"

出力(共通)

ダメージは80
ダメージは20