知りたいこと
2つの異なるリファクタリング方法について、それぞれのメリット・デメリットと使うべき場面を比較しつつ理解したい。
元コード
ruby
1def casual_introduce(first_name, age) 2 p [ 3 "my name is #{first_name}.", 4 "i'm #{age} years old." 5 ] 6end 7 8def formal_introduce(first_name, family_name, age) 9 p [ 10 "my name is #{family_name}, #{first_name} #{family_name}.", 11 "i'm #{age} years old." 12 ] 13end
実行結果は以下となる。
ruby
1casual_introduce("taro", 78) #=> ["my name is taro.", "i'm 78 years old."] 2formal_introduce("taro", "yamada", 78) #=> ["my name is yamada, taro yamada.", "i'm 78 years old."]
リファクタリング1
以下のコードは共通部分を別メソッドに抽出している。
ruby
1def casual_introduce(first_name, age) 2 p [ 3 "my name is #{first_name}.", 4 common_introduce(age) 5 ] 6end 7 8def formal_introduce(first_name, family_name, age) 9 p [ 10 "my name is #{family_name}, #{first_name} #{family_name}.", 11 common_introduce(age) 12 ] 13end 14 15private 16 17def common_introduce(age) 18 "i'm #{age} years old." 19end
こうすれば、共通部分を同時に変更したいときに手を入れる箇所が1箇所のみとなるため、変更のコストが少なく、変更漏れのリスクも小さくできる。
リファクタリング2
以下のコードは汎用的なメソッドを作成している。
ruby
1def casual_introduce(first_name, age) 2 introduce(first_name, age) 3end 4 5def formal_introduce(first_name, family_name, age) 6 introduce(first_name, family_name, age) 7end 8 9private 10 11def introduce(first_name, family_name = nil, age) 12 introduce = 13 if family_name.nil? 14 ["my name is #{first_name}."] 15 else 16 ["my name is #{family_name}, #{first_name} #{family_name}."] 17 end 18 introduce.push("i'm #{age} years old.") 19 p introduce 20end
これもまた、先程とは異なる方法によって、共通部分を1箇所にまとめている。
共通部分の修正コスト及び修正漏れリスクを低減するというメリットも生じているので、リファクタリングと呼べると思う。
知りたいこと
上記のリファクタリング1とリファクタリング2について、それぞれのメリット・デメリットと、「どのような場面でどれを使うべきなのか」という判断基準をもちたい。
ご教示の程よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/28 14:51 編集
2019/03/29 06:36
2019/04/01 23:40