From f2b5f3a2a360e26f7a723bc72462809dbf65cd0e Mon Sep 17 00:00:00 2001 From: Sibevin Wang Date: Mon, 23 Jan 2017 20:53:02 +0800 Subject: [PATCH 1/2] C: Refactoring with state pattern --- employee_after.rb | 41 ++++++++++++++++++ employee_state.rb | 96 +++++++++++++++++++++++++++++++++++++++++++ test/employee_test.rb | 3 +- 3 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 employee_after.rb create mode 100644 employee_state.rb diff --git a/employee_after.rb b/employee_after.rb new file mode 100644 index 0000000..e327b4e --- /dev/null +++ b/employee_after.rb @@ -0,0 +1,41 @@ +class Employee + attr_reader :state, :hp + + def initialize(state: state) + @state = state + @hp = init_hp + end + + def tickets_attack(atk) + est = EmployeeState.gen(state) + @hp = est.tickets_attack(@hp, atk) + update_state! + end + + def take_break + est = EmployeeState.gen(state) + @hp = est.take_break(@hp) + update_state! + end + + private + + def update_state! + @state = if hp > 100 + :super + elsif hp.between?(61, 100) + :normal + elsif hp.between?(31, 60) + :warning + elsif hp.between?(1, 30) + :dying + elsif hp <= 0 + :game_over + end + end + + def init_hp + est = EmployeeState.gen(state) + est.init_hp + end +end diff --git a/employee_state.rb b/employee_state.rb new file mode 100644 index 0000000..f559c27 --- /dev/null +++ b/employee_state.rb @@ -0,0 +1,96 @@ +module EmployeeState + SUPPORT_STATES = [:super, :normal, :warning, :dying, :game_over] + + def self.gen(state) + if SUPPORT_STATES.include?(state) + state_name = state.to_s.split('_').map(&:capitalize).join + Object.const_get("EmployeeState::#{state_name}").new + else + fail "Unknown api: #{kind}" + end + end + + class Base + def init_hp + fail NoImplementedError + end + + def tickets_attack(hp, atk) + fail NoImplementedError + end + + def take_break(hp) + fail NoImplementedError + end + end + + class Super + def tickets_attack(hp, atk) + hp - atk * 0.6 + end + + def take_break(hp) + hp - 10 + end + + def init_hp + 120 + end + end + + class Normal + def tickets_attack(hp, atk) + hp - atk * 0.8 + end + + def take_break(hp) + hp + 10 + end + + def init_hp + 100 + end + end + + class Warning + def tickets_attack(hp, atk) + hp - atk * 1 + end + + def take_break(hp) + hp + 40 + end + + def init_hp + 60 + end + end + + class Dying + def tickets_attack(hp, atk) + hp - atk * 1.5 + end + + def take_break(hp) + hp * 2 + end + + def init_hp + 30 + end + end + + class GameOver + def tickets_attack(hp, atk) + hp + end + + def take_break(hp) + hp + end + + def init_hp + 0 + end + end +end diff --git a/test/employee_test.rb b/test/employee_test.rb index 66bcfe7..4b6a60f 100644 --- a/test/employee_test.rb +++ b/test/employee_test.rb @@ -1,6 +1,7 @@ require 'pry' require 'minitest/autorun' -require_relative '../employee' +require_relative '../employee_state' +require_relative '../employee_after' describe Employee do From cc07c11bb0b623c3c83b2eace7813fe42583a74d Mon Sep 17 00:00:00 2001 From: Sibevin Wang Date: Mon, 23 Jan 2017 21:12:33 +0800 Subject: [PATCH 2/2] C: Refine codes --- employee_state.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/employee_state.rb b/employee_state.rb index f559c27..3ef54d1 100644 --- a/employee_state.rb +++ b/employee_state.rb @@ -6,7 +6,7 @@ def self.gen(state) state_name = state.to_s.split('_').map(&:capitalize).join Object.const_get("EmployeeState::#{state_name}").new else - fail "Unknown api: #{kind}" + fail "Unknown state: #{state}" end end @@ -24,7 +24,7 @@ def take_break(hp) end end - class Super + class Super < Base def tickets_attack(hp, atk) hp - atk * 0.6 end @@ -38,7 +38,7 @@ def init_hp end end - class Normal + class Normal < Base def tickets_attack(hp, atk) hp - atk * 0.8 end @@ -52,7 +52,7 @@ def init_hp end end - class Warning + class Warning < Base def tickets_attack(hp, atk) hp - atk * 1 end @@ -66,7 +66,7 @@ def init_hp end end - class Dying + class Dying < Base def tickets_attack(hp, atk) hp - atk * 1.5 end @@ -80,7 +80,7 @@ def init_hp end end - class GameOver + class GameOver < Base def tickets_attack(hp, atk) hp end