Last active
May 15, 2019 09:44
-
-
Save omedale/485e9c50ec9453d6f79bf25412cdb166 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Computer | |
def initialize(computer_id,data_source) | |
@id = computer_id | |
@data_source = data_source | |
end | |
def mouse | |
info = @data_source.get_mouse_info(@id) | |
price = @data_source.get_mouse_price(@id) | |
result = "Mouse:#{info}($#{price})" | |
return "*#{result}" if price>=100 | |
result | |
end | |
def cpu | |
info = @data_source.get_cpu_info(@id) | |
price = @data_source.get_cpu_price(@id) | |
result = "Cpu:#{info}($#{price})" | |
return "*#{result}" if price>=100 | |
result | |
end | |
def keyboard | |
info = @data_source.get_keyboard_info(@id) | |
price=@data_source.get_keyboard_price(@id) | |
result="Keyboard:#{info}($#{price})" | |
return "*#{result}" if price>=100 | |
result | |
end | |
end | |
# Refactored by adding dynamic dispatches | |
class Computer | |
def initialize(computer_id, data_source) | |
@id = computer_id | |
@data_source = data_source | |
end | |
# call to each method is delegated to component | |
def mouse | |
component :mouse | |
end | |
def cpu | |
component :cpu | |
end | |
def keyboard | |
component :keyword | |
end | |
def component(name) | |
info = @data_source.send "get_#{name}_info", (@id) | |
price= @data_source.send "get_#{name}_price", (@id) | |
result= "#{name.capitalize}: #{info}($#{price})" | |
return "*#{result}" if price>=100 | |
result | |
end | |
end | |
# Generating method dynamically | |
class Computer | |
def initialize(computer_id, data_source) | |
@id = computer_id | |
@data_source = data_source | |
end | |
def self.define_component(name) | |
define_method(name) do | |
info = @data_source.send("get_#{name}_info", @id) | |
price = @data_source.send("get_#{name}_price", @id) | |
result = "#(name.capitalize}: #{info} ($#{price})" | |
return "#{result}" if price >= 100 | |
result | |
end | |
end | |
define_component :mouse | |
define_component :cpu | |
define_component :keyboard | |
end | |
# refactor using method_missing | |
class Computer | |
def initialize(computer_id, data_source) | |
@id = computer_id | |
@data_source = data_source | |
end | |
def method_missing(name) | |
super if !@data_source.respond_to?("get_#{name}_info") | |
info = @data_source.send("get_#{name}_info", @id) | |
price = @data_source.send("get_#{name}_price", @id) | |
result = "#(name.capitalize}: #{info} ($#{price})" | |
return "#{result}" if price >= 100 | |
result | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment