Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

書籍 Refactoring to Patterns | Utilities | Extract Parameter

パンくず

書籍 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