Tbpgr Blog

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

書籍 リファクタリング−プログラマーの体質改善 | 継承の取り扱い | スーパークラスの抽出

内容

適用ケース要約

同じような機能を持つ2つのクラスがある。

適用内容要約

片方のクラスをスーパークラスにして、共通するメンバをスーパークラスに移す。

適用詳細

ある複数のクラスに共通点があり、片方がもう片方に対してis-a関係にある場合に
スーパークラスの抽出を行う。

サンプル

Webページクラス、照会系ページクラスと登録系ページクラスが別々にあるとします。
Webページクラスは、「ページを表示する」メソッドを持ちます。
照会系ページは「ページを表示する」メソッドと「検索をする」メソッドを持ちます
登録系ページは「ページを表示する」メソッドと「データを登録する」メソッドを持ちます

サンプルコード

リファクタリング

# encoding: Shift_JIS

class WebPage
  PAGE_TITLE="WebPage"
  def output_page()
    puts "#{PAGE_TITLE}を表示します"
  end
end

class ReferencePage
  PAGE_TITLE="照会"
  def output_page()
    puts "#{PAGE_TITLE}照会ページを表示します"
  end
  def search()
    puts "検索します"
  end
end

class RegisterPage
  PAGE_TITLE="登録"
  def output_page()
    puts "#{PAGE_TITLE}登録ページを表示します"
  end
  def register()
    puts "登録画面します"
  end
end

web_page = WebPage.new
web_page.output_page
ref_page = ReferencePage.new
ref_page.output_page
ref_page.search
reg_page = RegisterPage.new
reg_page.output_page
reg_page.register

リファクタリング

# encoding: Shift_JIS

class WebPage
  PAGE_TITLE="WebPage"
  def output_page()
    puts "#{get_page_title}を表示します"
  end
  
  def get_page_title()
    return PAGE_TITLE
  end
end

class ReferencePage < WebPage
  PAGE_TITLE="照会"
  def search()
    puts "検索します"
  end
  def get_page_title()
    return PAGE_TITLE
  end
end

class RegisterPage < WebPage
  PAGE_TITLE="登録"
  def register()
    puts "登録画面します"
  end
  def get_page_title()
    return PAGE_TITLE
  end
end

web_page = WebPage.new
web_page.output_page
ref_page = ReferencePage.new
ref_page.output_page
ref_page.search
reg_page = RegisterPage.new
reg_page.output_page
reg_page.register

出力(リファクタリング後)

WebPageを表示します
照会照会ページを表示します
検索します
登録登録ページを表示します
登録画面します