パンくず
書籍 Refactoring to Patterns
Utilities
Extract Parameter
概要
Extract Parameterについて
使用する場面
委譲の利用時に他のオブジェクトのインスタンス生成のための
パラメータが必要な場合。
対応方法
Extract Parameterを適用する。
サンプル
リファクタリング前
# encoding: Windows-31J require "pp" class RubyClass attr_accessor:class_name,:ruby_methods def initialize(class_name) @class_name=class_name @ruby_methods = Array.new end def addMethod(method_name, parameters) ruby_method = RubyMethod.new(method_name) parameters.each do |parameter| ruby_method.addParameter(parameter) end @ruby_methods.push(ruby_method) end def output_class() result = "" result << "class " result << "#{@class_name}\n" @ruby_methods.each do |ruby_method| result << "\tdef #{ruby_method.method_name}(" ruby_method.parameters.each do |parameter| result << "#{parameter}," end result = result.chop! result << ")\n" end result << "end" end end class RubyMethod attr_reader:method_name,:parameters def initialize(method_name) @method_name=method_name @parameters = Array.new end def addParameter(parameter);@parameters.push(parameter);end end ruby_class = RubyClass.new("HogeClass") ruby_class.addMethod("hoge_method1", %w[param1_1 param1_2]) ruby_class.addMethod("hoge_method2", %w[param2_1 param2_2]) puts ruby_class.output_class
リファクタリング後
# encoding: Windows-31J require "pp" class RubyClass attr_accessor:class_name,:ruby_methods def initialize(class_name) @class_name=class_name @ruby_methods = Array.new end def addMethod(ruby_method) @ruby_methods.push(ruby_method) end def output_class() result = "" result << "class " result << "#{@class_name}\n" @ruby_methods.each do |ruby_method| result << "\tdef #{ruby_method.method_name}(" ruby_method.parameters.each do |parameter| result << "#{parameter}," end result = result.chop! result << ")\n" end result << "end" end end class RubyMethod attr_reader:method_name,:parameters def initialize(method_name) @method_name=method_name @parameters = Array.new end def addParameter(parameter);@parameters.push(parameter);end end ruby_class = RubyClass.new("HogeClass") ruby_methods = [RubyMethod.new("hoge_method1"),RubyMethod.new("hoge_method2")] %w[param1_1 param1_2].each {|parameter|ruby_methods[0].addParameter parameter} %w[param2_1 param2_2].each {|parameter|ruby_methods[1].addParameter parameter} ruby_methods.each{|ruby_method|ruby_class.addMethod(ruby_method)} puts ruby_class.output_class
出力
class HogeClass def hoge_method1(param1_1,param1_2) def hoge_method2(param2_1,param2_2) end