Skip to content

Instantly share code, notes, and snippets.

@omedale
Last active May 15, 2019 09:44
Show Gist options
  • Save omedale/485e9c50ec9453d6f79bf25412cdb166 to your computer and use it in GitHub Desktop.
Save omedale/485e9c50ec9453d6f79bf25412cdb166 to your computer and use it in GitHub Desktop.
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