Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

書籍 リファクタリング−プログラマーの体質改善 | 継承の取り扱い | コンストラクタ本体の引き上げ

内容

適用ケース要約

複数のサブクラスに内容がほとんど同一のコンストラクタがある。

適用内容要約

スーパークラスコンストラクタを作成して、サブクラスから呼び出す。

適用詳細

複数のサブクラスが同じコンストラクタの処理を持っている場合、
継承元に引き上げを行う。

サンプル

プログラマークラスから派生した、JavaプログラマークラスとRubyプログラマークラスがあるとします。
リファクタリング前は双方のクラスのコンストラクタに共通の処理があります。

サンプルコード

リファクタリング

# 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


リファクタリング

# encoding: Shift_JIS

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

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

class RubyProgrammer < Programmer
  attr_accessor:name
  def initialize(name)
    super(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