Tbpgr Blog

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

書籍 リファクタリング−プログラマーの体質改善 | 継承の取り扱い | メソッドの引き上げ

内容

適用ケース要約

2つのサブクラスが同じメソッドを持っている。

適用内容要約

そのメソッドスーパークラスに移動する。

適用詳細

複数のサブクラスが同じメソッドを持っている場合、
継承元に引き上げを行う。

サンプル

プログラマークラスから派生した、JavaプログラマークラスとRubyプログラマークラスがあるとします。
リファクタリング前は双方のクラスにコーディングメソッドがあります。
この振る舞いは共通になるため、継承元に引き上げます。

サンプルコード

リファクタリング

# encoding: Shift_JIS

class Programmer
  attr_accessor:main_language
end

class JavaProgrammer < Programmer
  attr_accessor:name
  def initialize(name)
    @name=name
    @main_language="Java"
  end
  
  def coding()
    puts "#{main_language} coding"
  end
end

class RubyProgrammer < Programmer
  attr_accessor:name
  def initialize(name)
    @name=name
    @main_language="Ruby"
  end

  def coding()
    puts "#{main_language} coding"
  end
end

java_pg = JavaProgrammer.new("tanaka")
ruby_pg = RubyProgrammer.new("suzuki")
java_pg.coding
ruby_pg.coding


リファクタリング

# encoding: Shift_JIS

class Programmer
  attr_accessor:main_language
  def coding()
    puts "#{main_language} coding"
  end
end

class JavaProgrammer < Programmer
  attr_accessor:name
  def initialize(name)
    @name=name
    @main_language="Java"
  end
end

class RubyProgrammer < Programmer
  attr_accessor:name
  def initialize(name)
    @name=name
    @main_language="Ruby"
  end
end

java_pg = JavaProgrammer.new("tanaka")
ruby_pg = RubyProgrammer.new("suzuki")
java_pg.coding
ruby_pg.coding

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

Java coding
Ruby coding