パンくず
リファクタリング-プログラマーの体質改善テクニック
継承の取り扱い
サブクラスの抽出:Extract Subclass
内容
リファクタリング名
サブクラスの抽出:Extract Subclass
適用ケース要約
クラスが一部のインスタンスだけしか使わないメンバを持っている。
適用内容要約
それらのメンバのためにサブクラスを作る。
適用詳細
あるクラスにis-a関係になるような要素がまとまってしまっていたら
B is AのBにあたる部分をサブクラスに抽出します。
委譲にするかどうかの判断は、is-aかhas-aかで行う。
サンプルコード
# 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でダック・タイピング