Tbpgr Blog

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

書籍 リファクタリング−プログラマーの体質改善 | データの再編成 | コレクションのカプセル化

内容

リファクタリング

コレクションのカプセル化

適用ケース要約

メソッドがコレクションを返している

適用内容要約

メソッドにはコレクションのコピーを返させるようにして、add_、remove_メソッドを用意する

適用詳細

コレクションを利用するクライアントとオーナーの結合度を下げるためには
以下のリファクタリングが有効です。

・コレクション本体を返却せずコピーを返却する
・コレクションの追加・削除をカプセル化してメソッドを用意する

これにより、モジュールの結合度が下がります。

サンプル

プログラマー複数の言語を習得しているモデルを実装します。
リファクタリング前は言語のリストを公開しています。
リファクタリングにより言語のリストをカプセル化します。

サンプルコード

リファクタリング

# encoding: Shift_JIS

class Programmer
  attr_accessor:name,:language_list
  
  def initialize(name)
    @language_list=Array.new
    @name=name
  end
  
  def display_language()
    result = "#{name}"
    @language_list.each {|language|
      result << "#{language},"
    }
    result.chop!
    result << "を得意としています"
    puts result
  end
end

tbpg = Programmer.new("tbpg")
tbpg.language_list.push "Java"
tbpg.language_list.push "JavaScript"
tbpg.language_list.push "Ruby"
tbpg.display_language

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

tbpgはJava,JavaScript,Rubyを得意としています

リファクタリング

# encoding: Shift_JIS

class Programmer
  attr_accessor:name
  @language_list
  
  def initialize(name)
    @language_list=Array.new
    @name=name
  end
  
  def add_language(language)
    @language_list.push language
  end
  
  def delete_language(language)
    @language_list.delete(language)
  end
  
  def initialize_languge(language_list)
    @language_list = language_list
  end
  
  def languages()
    return @language_list.clone
  end
  
  def display_language()
    result = "#{name}"
    @language_list.each {|language|
      result << "#{language},"
    }
    result.chop!
    result << "を得意としています"
    puts result
  end
end

tbpg = Programmer.new("tbpg")
tbpg.add_language "Java"
tbpg.add_language "JavaScript"
tbpg.add_language "Ruby"
tbpg.display_language

# cloneを取得
languages = tbpg.languages

# 最初の要素をC#に変更
puts languages[0] = "C#"
puts languages

# cloneを変更してもコピー元には影響なし
tbpg.display_language
tbpg.delete_language "JavaScript"
# JavaScriptを削除して確認
tbpg.display_language

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

tbpgはJava,JavaScript,Rubyを得意としています
C#
C#
JavaScript
Ruby
tbpgはJava,JavaScript,Rubyを得意としています
tbpgはJava,Rubyを得意としています