Tbpgr Blog

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

書籍 リファクタリング−プログラマーの体質改善 | 継承の取り扱い | 継承による委譲の置き換え

内容

リファクタリング

継承による委譲の置き換え

適用ケース要約

委譲を使っているが、インターフェイス全体のために多数の委譲メソッドを書いている

適用内容要約

委譲先のクラスをモジュールにして、委譲元のクラスでインクルードする

適用詳細

委譲先の全メソッドを利用しているような場合、継承への置き換えを検討します

サンプル

HTMLタグを表す機能と、Divタグを表す機能を実装します。

サンプルコード

リファクタリング

# encoding: Shift_JIS

class HtmlTag
  attr_accessor:tag_name
  
  def initialize(tag_name)
    @tag_name=tag_name
  end

  def output_start_tag()
    return "<#{@tag_name}>"
  end
  
  def output_close_tag()
    return "</#{@tag_name}>"
  end
  
  def get_html_contents(value)
    result = ""
    result << output_start_tag
    result << value
    result << output_close_tag
    return result
  end
end

class DivTag
  attr_accessor:html_tag
  
  def initialize()
    @html_tag=HtmlTag.new("div")
  end

  def output_start_tag()
    return @html_tag.output_start_tag
  end
  
  def output_close_tag()
    return @html_tag.output_close_tag
  end
  
  def get_html_contents(value)
    result = ""
    result << output_start_tag
    result << value
    result << output_close_tag
    return result
  end
end

puts HtmlTag.new("span").get_html_contents "inner text"
puts DivTag.new().get_html_contents "inner text"

リファクタリング

# encoding: Shift_JIS

class HtmlTag
  attr_accessor:tag_name
  
  def initialize(tag_name)
    @tag_name=tag_name
  end

  def output_start_tag()
    return "<#{@tag_name}>"
  end
  
  def output_close_tag()
    return "</#{@tag_name}>"
  end
  
  def get_html_contents(value)
    result = ""
    result << output_start_tag
    result << value
    result << output_close_tag
    return result
  end
end

class DivTag < HtmlTag
  def initialize()
    @tag_name="div"
  end
end

puts HtmlTag.new("span").get_html_contents "inner text"
puts DivTag.new().get_html_contents "inner text"

出力(共通)

<span>inner text</span>
<div>inner text</div>