ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

リファクタリングRuby 6〜9章

はじめに

リファクタリングの実際のテクニック編の部分を振り返ってみる。ただ、内容が難しく、とりあえずすべて目を通す気持ちで、分からない部分は飛ばした。これは今自分はRuby on Rails上でのrubyのコードしか触ってないからだろうなあ。。。

6章 メソッドの構成方法

6.1 メソッドの抽出(Extract Method)

リファクタリングといえば、まずはこれ。実際、共通する処理はまずメソッド化する。あとこの本を読んで気づいたのが、「分かりやすい名前」のメソッドであればコードの可読性もあがる点。何をやっているかが簡単にわかる。

6.2 メソッドのインライン化(Inline Method)

これは6.1と逆で、あまりに処理が明確であればメソッドを削除し、呼び出し元に組み込むこと。これはバランスだろうなあ、処理の移譲が多すぎて追い切れない場合は粒度を考えなおしてインライン化をしたほうがいいんだろう。

6.4 一時変数から問い合わせメソッドへ(Replace Temp with Query)

これは便利だなーと思いました。よく一時変数は使うけれど、確かに問い合わせメソッド化すれば再利用もできるし、メインのコードも読みやすくなる。

6.5 一時変数からチェインへ(Replace Temp with Chain)

これは好みなのかなあと。チェインがあまりに長くなるのも見難い気がする。これはチェインに使うであろうメソッドの名前をわかりやすくすれば解決できるね。

6.6 説明用変数の導入

これも納得。複雑な式を評価する場合は変数にしたほうが良いね。読みやすい。

if(platform.upcase.index("MAC") &&
  browser.upcase.index("IE"))
#何かする
end

is_mac_os = platform.upcase.index("MAC") 
is_ie_browser = browser.upcase.index("IE")

if is_mac_os && is_ie_browser
#何かする
end

6.7 一時変数の分割(Split Temporary Variable)

これは、ループ変数や計算結果の蓄積用の変数でもないのに、複数回(別の用途で)利用される変数はそれぞれ別名にしましょうという話。ごもっともです。

6.8 引数への代入の除去(Remove Assignments to Parameters)

これは、引数として渡された変数の値を直接変えることが問題というより、別のオブジェクトを参照させるようにしてしまうのが良くないと言っている。

6.11 ループからコレクションクロージャメソッドへ(Replace Loop with Collection Closure Method)

collect (map)、select (filter)、inject (reduce)メソッドのことだろう。あんまり使わないので使えるようになっとかないと。

7章 オブジェクト間でのメンバの移動 / 8章 データの構成

最近遠のいてる部分なのでスキップしました。

9章 条件式の単純化

9.5 制御フラグの除去(Remove Controle Flag)

メソッドの入口と出口は1つずつという考えに従って何らかの制御フラグを使うのは害悪なのでbreakやnext、returnを使えという内容。

9.8 nullオブジェクトの導入(Introduce Null Object)

nilのエラーがあまりに多いのにはうんざりしていて、確かに中身が存在するか(present?)はよく使う。

振り返り

ちょっと内容も難しいものが多かった。。。普段railsっていうフレームワークの上でしかプログラミングしてないからクラスって概念を忘れつつある、いけない。。。