パンくず
内容
適用ケース要約
メソッドがコレクションを返している
適用詳細
コレクションを利用するクライアントとオーナーの結合度を下げるためには
以下のリファクタリングが有効です。
・コレクション本体を返却せずコピーを返却する
・コレクションの追加・削除をカプセル化してメソッドを用意する
これにより、モジュールの結合度が下がります。
サンプルコード
# 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を得意としています