Tbpgr Blog

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

書籍 リファクタリング−プログラマーの体質改善 | 継承の取り扱い | 委譲による継承の置き換え

内容

リファクタリング

委譲による継承の置き換え

適用ケース要約

サブクラスがスーパークラスの一部のインターフェースだけを使っている。あるいはデータを継承したくない

適用内容要約

スーパークラス用のフィ0ルドを作成して、メソッドスーパークラスに委譲するように変更し、継承をやめる

適用詳細

継承にふさわしくないような場面で継承が利用されていた場合に委譲に置き換える。

サンプル

データリストのクラスをListを継承して作成してあるケースを想定し、
委譲に置き換えます。

サンプルコード

リファクタリング

# encoding: Shift_JIS

class Order
  attr_accessor:order_no
  def initialize(order_no)
    @order_no=order_no
  end
end

class OrderList < Array
  def add_order(order)
    self.push(order)
  end
  
  def pop_order()
    self.pop()
  end
end

order_list = OrderList.new
order_list.add_order(Order.new(1))
order_list.add_order(Order.new(2))
order_list.add_order(Order.new(3))
order_list.pop_order()
order_list.each {|order|puts "order_no:#{order.order_no}"}

リファクタリング

# encoding: Shift_JIS

class Order
  attr_accessor:order_no
  def initialize(order_no)
    @order_no=order_no
  end
end

class OrderList
  attr_accessor:order_list
  def initialize()
    @order_list=Array.new
  end
  
  def add_order(order)
    @order_list.push(order)
  end
  
  def pop_order()
    return @order_list.pop()
  end
  
  def get_list()
    return @order_list
  end
end

order_list = OrderList.new
order_list.add_order(Order.new(1))
order_list.add_order(Order.new(2))
order_list.add_order(Order.new(3))
order_list.pop_order()
order_list.get_list().each {|order|puts "order_no:#{order.order_no}"}

出力(共通)

order_no:1
order_no:2