【孤独な読書会 1-1】 リファクタリング 1章
前置き
孤独な読書会と題して、読んだ本のまとめ・感想を読んだ分だけ記載できたらと思っております。要はただの本の感想・まとめ記事です。
今回はIT業界では名著と言われているMartin Flowloer[著] のリファクタリングです。
https://www.amazon.co.jp/dp/B01IGW5MG0/
私は本書を半年ほど前に購入したものの、その重厚さも相まってモチベーションが上がらず積み上げておりました。ブログを書くということをモチベーションに読破しようというのが本目的になります。 名目上読書会なので、1章ずつ読んではまとめるというスタンスで実施していこうと考えております。 さて、前置きが長くなりましたが本題に入っていきたいと思います。
1章
全体の感想
1章は本書にも記載されていますが「リファクタリングってこんなもの」という雰囲気を知ることができる章になってます。 一般に本書のような書籍およびカンファレンスは以下のように続くことが多いです。
1章. 歴史や定義・あるいは意義
2章. 本題
3章. ・・・
つまり、1章で眠たくなる・飽きるのですが、本書は1章で実際のコードを用いて「こんな風にリファクタリングってするんだぜ!詳細は後で説明するけどな!」というスタンスで記載してくれています。 そのため、この本を購入するかどうか検討されているかたがいらっしゃいましたら、是非第1章を一度読んでいただいて、ご検討いただければと思います。(「amazonのなか見!検索」で1章のほとんどを読むことができるので、購入の検討はそこでできるかと思います)
気になったところ
第一章では、上述のとおり「リファクタリングってこんなもの」という雰囲気を実際のコードをリファクタリングする様子から感じとる章になっています。そのため、各リファクタリング手法?は後で出てくるから、今はよくわからないだろうけど使うぜ!というスタンスで使われていきます。 それらの手法は、感覚として知っているものもあれば感覚に反するものもありました。 1章で出た手法と私の感覚を対比してみると以下の通りになりました。
■感覚通りの手法
■感覚通りではない手法
- 一時変数の置き換え
さて、この感覚通りではない一時変数の置き換えですが、例えば以下のようなことをしております。(forループ条件は適当)
MethodA() { Target target; int conter = 0 String result = ""; for(hoge) { result = Method(target); counter = counter + target.getNum(); } result = result + counter; }
こんなコードの一時変数counterがダメなので以下のようにメソッド化して置き換える。
MethodA() { Object target; for(hoge) { Method(target); } result = result + getCount(); } int getCount(Target target){ int rtnValue = 0; for(hoge){ rtnValue + target.getNum(); } return rtnValue; }
さて、こうするとMethodAのコード量は確かに短くなってよさそうに見えるのですが、全体のコード量は増えたばかりか、forループを2回まわすことになり 計算量として高々定数倍ですが増加してしまいます。そのため、私は今まで上のようなコードを書いていたのですが以下のような観点から下にすべきだそうです。
1.リファクタリング時は「かもしれない」パフォーマンスはあまり気にしなくて良い。
高々定数倍でしか速さは変わらないため一般的にパフォーマンスの影響度合いは低い。そのため、まずは修正してしまってパフォーマンスチューニングのタイミングで変更が必要であれば変更すれば良いし、リファクタリングしておいたほうが変更するときに問題個所の特定および修正が容易だそうです。
2.再利用することを考えるとたしかに使いやすい(私の考え)
確かに例えば、今回のgetCountなどループ処理で一緒に行う処理を取り出してみるとそれ単品で意味がある処理に変わっていると感じました。 つまり、他の処理でも使いやすく、再利用しやすい形に変わっているとも理解しました。 以降の章で詳細に説明してもらう箇所が楽しみです!!
よくわからなかったところ
ある意味全部・・・・ 今回は「リファクタリングってこんなもの」という雰囲気だけだったため、各手法の詳細な話はなにもありませんでした。 自分自身でこんな感じだろうなと思う部分はありましたが、現状よくわかっていない部分が大きいです。 上述しましたが、各手法の詳細をきちんと学ぶことができることが非常に楽しみです!