classComputer definitialize(computer_id, data_source) @id = computer_id @data_source = data_source end
defmouse 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
defcpu 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
defkeyboard 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
defself.define_component(name) define_method(name) do info = @data_source.get_keyboard_info(@id) price = @data_source.get_keyboard_price(@id) result = "keyboard: #{info} ($#{price})" price >= 100 ? "* #{result}" : result end end end
method_missingを使ったリファクタリング
さきほどの Computer クラスを method_missing でリファクタリングした場合。
classComputer definitialize(computer_id, data_source) @id = computer_id @data_source = data_source end
defmethod_missing(name) superif !@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})" price >= 100 ? "* #{result}" : result end
defrespond_to_missing?(method, include_private = false) @data_source.respond_to?("get_#{method}_info") ||super end end