Tbpgr Blog

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

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

内容

リファクタリング

サブクラスの抽出:Extract Subclass

適用ケース要約

クラスが一部のインスタンスだけしか使わないメンバを持っている。

適用内容要約

それらのメンバのためにサブクラスを作る。

適用詳細

あるクラスにis-a関係になるような要素がまとまってしまっていたら
B is AのBにあたる部分をサブクラスに抽出します。
委譲にするかどうかの判断は、is-aかhas-aかで行う。

サンプル

プログラマークラスにJavaプログラマ,Rubyプログラマ双方の処理を含んでいるとします。
リファクタリングにより、サブクラスの抽出を行います。

サンプルコード

リファクタリング

# encoding: Shift_JIS

class Programmer
  attr_accessor:name,:main_language
  def initialize(name,main_language)
    @name=name
    @main_language=main_language
  end
  
  def duck_typing()
    puts "Rubyでダック・タイピング"
  end
  
  def create_abstract_class()
    puts "Javaで抽象クラスを作成"
  end
  
  def create_class()
    puts "Classを作成"
  end
end

java_pg = Programmer.new("suzuki","Java")
ruby_pg = Programmer.new("tanaka","Ruby")
java_pg.create_class
java_pg.create_abstract_class

ruby_pg.create_class
ruby_pg.duck_typing


リファクタリング

# encoding: Shift_JIS

class Programmer
  attr_accessor:name,:main_language
  def initialize(name,main_language)
    @name=name
    @main_language=main_language
  end
  
  def create_class()
    puts "Classを作成"
  end
end

class JavaProgrammer < Programmer
  def initialize(name)
    super(name,"Java")
  end
  def create_abstract_class()
    puts "Javaで抽象クラスを作成"
  end
end

class RubyProgrammer < Programmer
  def initialize(name)
    super(name,"Ruby")
  end
  def duck_typing()
    puts "Rubyでダック・タイピング"
  end
end

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

ruby_pg.create_class
ruby_pg.duck_typing

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

Classを作成
Javaで抽象クラスを作成
Classを作成
Rubyでダック・タイピング