こんにちは。いっとくです!
好きなものはリファクタリング。嫌いなものは変な名前の変数です!
仕事でやらないといけない作業があった時に、次の人が使いやすいようにしておくのってすごく大事だと思うんですよ。
例えば、居酒屋のキッチンで働いている人なら、なくなった食材を補充しておくとか。
例えば、清掃員なら決められた場所に道具を戻すとか。
例えば、営業なら、、、なんでしょうねぇ、えーっと受話器にハナクソつけないとか、そんな感じです。
そうすることによって、一緒に働く人もストレスを感じにくくなるし、作業も捗るしで、最終的には職場全体としての生産の総量が増えると思うんですよ。
で、これに関してさらに一つ思ったことがありまして、エンジニアってこの部分に関してできることが多いし、それに対する見返りも大きいんじゃないかなって。
俗にいう、リファクタリングっていう行為です。
中にはプログラムの機能や働きを変えずに、中身だけ変えるなんて、なんて無駄な作業なのでしょう!なんて思う人もいそうだけど。
でも開発を続けていくと中の作りはどんどんカオスになっていきますよね。
メソッドが肥大化したり、共通化するために切り分けたのに、使わなかったり。
そして気づけば、ちょっと変更したいだけなのにいろんな箇所をチェックしないといけなくなってたり、毎回作業にとりかかる前にコードの意図を理解する時間が必要になったり、同じような変更を何箇所もしないといけなくなっていたりするなど、負担がどんどん増えていきます。
ってことで、やっぱりリファクタリング大事ですよ。
コピペで増えたであろう似たようなコードを何箇所も修正したくないし、土日を挟むたびに何が書いてあるか思い出さないと作業できないなんて不幸すぎる!
そんな背景もあり、以前書いたボーイスカウト・ルールに関する記事では、自分が触った箇所の周辺を、さわる前より少しずつ綺麗にしていきましょう!と言ってきました。
だけどね、実践している中で気づいてしまったんですよ。
…僕にはそもそもリファクタリングの引き出しがないって!
変数名をわかりやすくしたり、長いメソッドを切り分けることくらいはできます。
でも、サブクラスを使ったポリモーフィックなプログラムの書き方や、デザインパターンを使っていい感じにするとか、そう言った知識がゼロなんです。
なんていうかゲームのルールはわかっているけど、実践で使えるテクニックを知らない状態という気持ち。
ということで、まずは基礎から学んでいこうということで、手に取った本がこちら。
著:Martin Fowler 出版:オーム社
タイトルがそのまんまですが、リファクタリングに関する技術書といえば一番最初に名前が上がってくる本です!
はじめこの本を開いた時、「うわ、Java…」となりましたね。僕はPHPしか使ったことがないので。
ただ、基本的な文法はそこまで変わらなかったので、調べながらやっていれば何が書いてあるコードなのか理解できるくらいにはなってました。
内容に関しては、今の現場で使えそうなテクニックがバンバン詰まっていました。明日からでも使えそう。というか今までリファクタリングと言っても具体的な物差しを持っていなかったので、どこをやればいいんだろうという感じでしたが、そこが明確になったのがすごくよかったかも。
ぶっちゃけ自分のスキル不足で理解できない部分もあり、今後も何度か目を通していきたいとは思ったのですが、現状でもかなり得るものがあったので、Javaを書けない駆け出しPHPerがリファクタリングを読んで得たことについてまとめていきたいと思います!
リファクタリングは小さく始めることができる
本書の構成は大きく分けると以下のような構成になっている。
- リファクタリングの事例
- リファクタリングのメリット
- リファクタリングの具体的なテクニック集
ほとんどは3がメインで、コード内の不吉なコードをリファクタリングするためのテクニックがたくさん紹介されています。
そして各テクニックごとに、どんなケースでやるべきか、どんな手順を踏むべきか、実際のコードだとどのようになっているのかということが、事細かに解説されています。
技術書って割と難しいことが解説もないまま出てきて、突き放されることも少なくない中、この「新装版リファクタリング」は読んでいる人にかなり寄り添った内容になっています。このおもてなしこそが、世界最高峰のリファクタリング好きのメンタリティなんでしょうか。
本当にこの本はテクニック集のようにまとまっている部分がほとんどのページを占めています。概念的な話はほんの一部。
なので、リーダブルコードのように、読み物として読んでおくべきというよりは、1冊手元に置いておいて、都度問題にぶつかった時に、この本から解決方法を探してみるというリファレンス的な使い方が一番いいんじゃないかと思います。
この本に目を通して思ったのですが、紹介されているリファクタリングのケースは一つ一つが小さなケースになっています(実際のコードだと肥大化するんでしょうけど)
そのため、はじめに想像していた、構造を丸ごと変えるような大きなリファクタリングというのは実際にはほとんどなくて、細かいリファクタリングを積み重ねていくことで、振り返った時に大きなリファクタリングになっているというようなものなのかなと感じました。
長いメソッドの分割や、説明変数の導入、パラメータを短くする方法や、ガード節で制御構文のネストを短くする方法など、怪しいコードを見つけた瞬間にどんどん実装していけるような小さなテクニックが満載なので、少しずつでいいからリファクタリングを始めてみたいという人にも有益な本だったなと思います。
Javaがわからなくても大丈夫(たぶん)
ちなみに本書はJavaで書かれています。
しかし、基本的にはオブジェクト指向言語を使っているのであれば、ちょっと書き方を調べるだけで問題なく読み進めることができます。
僕はPHPしか使えないのですが、割と使用するキーワードも共通しているし、書き方はあんまり変わりません。Javaだと型の宣言がいたるところについていることくらいでしょうか。
最後までやってみましたが、特に「何これ?」みたいな書き方はなかったので別にJavaができる必要はないかなと思いました。
強いていえば、フロントエンドエンジニアの方が読むとしたら苦戦するかも。(というかフロントとはリファクタリングの方法が全然違う気がするので別の本読むよねー!)
むしろJava以外の言語をやっている人はやるべきかもしれません。
以前、とある勉強会に参加した時に、Quita界の某有名人の方が、違う言語のプログラムを自分が使っている言語で書き換えるのはめちゃくちゃ力になると言っていたので。
良書と言われている技術書でJavaで書かれているものはたくさんあるので、積極的にやってみたいな〜と思った次第です。
どんな人に効果があるか
じゃあ本書はどんな人にとって最大の効用が得られるかを考えてみましたが、ズバリ…
これからリファクタリングを始めたいと思っているオブジェクト指向言語を使っているバックエンドエンジニア
ですね。
僕が今働いている現場のソースコードは、あまりオブジェクト指向言語の特徴を活用しておらず、関数型プログラミング的な書き方が非常に多いため、継承とかを使ったリファクタリングが適用できないんですよね…
一からクラス構成を見直して、うまいことやれば活用できますが、さすがにそこまでするとなると、一人の判断でできる規模の話ではなくなります。
なので、すでにクラスとか継承とかインターフェースとかの形に沿っているけど、なんか読みづらいんだよね、うちのコード。みたいな思いを抱えている現場にとっては銀の弾丸になりそうなくらいぶっ刺さりそう。
ただ、そこまでオブジェクト指向の特徴を生かしていないソースコードでも、できることはたくさん載っているので、やる価値は全然あります。
そして読み進めていくと、ある程度理想的なクラス構成についてもイメージが湧いてくるようになります。
そう言った点では、別にリファクタリング自体に興味がなくても、いいコードを書くための知識として、1度目を通して損のない内容だったと思います。
ちなみにQuitaではこの本がない職場は不幸とまで言われていました。笑
きっと、自分のスキルが追いつけば、もっと有益な情報として捉えることができるのでしょうね…
ということで定期的に読んで、自分の血肉にしていこうと思います。
以上、いっとくでした。おしまい!
コメント