From 49e3e1a21c473e05388c319cc179bfc57f405283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Mota?= Date: Fri, 3 May 2013 16:37:07 +0100 Subject: [PATCH] Replace Type Code with Module Extension. --- .../lib/after.rb | 37 +++++++++++++++++++ .../lib/before.rb | 28 ++++++++++++++ .../test/test.rb | 19 ++++++++++ 3 files changed, 84 insertions(+) diff --git a/replace-type-code-with-module-extension/lib/after.rb b/replace-type-code-with-module-extension/lib/after.rb index e69de29..c82eea4 100644 --- a/replace-type-code-with-module-extension/lib/after.rb +++ b/replace-type-code-with-module-extension/lib/after.rb @@ -0,0 +1,37 @@ +class Employee + def initialize(type: :regular) + @type = type + end + + def base_salary + 500.0 + end + + def salary + base_salary + bonus + end + + def self.build(type: :regular) + instance = new + instance.extend const_get(type.capitalize) + end + +end + +module Regular + def bonus + 0 + end +end + +module Manager + def bonus + 800 + end +end + +module Boss + def bonus + 1500 + end +end diff --git a/replace-type-code-with-module-extension/lib/before.rb b/replace-type-code-with-module-extension/lib/before.rb index e69de29..20b81b5 100644 --- a/replace-type-code-with-module-extension/lib/before.rb +++ b/replace-type-code-with-module-extension/lib/before.rb @@ -0,0 +1,28 @@ +class Employee + def initialize(type: :regular) + @type = type + end + + def base_salary + 500.0 + end + + def salary + base_salary + bonus + end + + private + + def self.build(type: :regular) + new type: type + end + + def bonus + value = case @type + when :regular then 0 + when :boss then 1500.0 + when :manager then 800.0 + end + end + +end diff --git a/replace-type-code-with-module-extension/test/test.rb b/replace-type-code-with-module-extension/test/test.rb index a8f6974..4b3a8ff 100644 --- a/replace-type-code-with-module-extension/test/test.rb +++ b/replace-type-code-with-module-extension/test/test.rb @@ -3,3 +3,22 @@ require 'before' if ENV["BEFORE"] require 'after' unless ENV["BEFORE"] + +describe Employee do + describe "a regular one" do + it "has a salary" do + Employee.build.salary.must_equal 500.0 + end + end + + describe "a boss" do + it "has a salary" do + Employee.build(type: :boss).salary.must_equal 2000.0 + end + end + describe "a manager" do + it "has a salary" do + Employee.build(type: :manager).salary.must_equal 1300.0 + end + end +end