Tennis-Refactoring-KataでRubyのリファクタリングの練習をやってみた
Refactoring Kataでリファクタリングを練習しています。今日も頑張りました。
Tennis-Refactoring-Kata
概要
- テニスのスコアリングをするプログラムのリファクタリングを行う
- テストは書いてある
- 同じ仕様のプログラムが3パターン用意されていて、それぞれ違ったややこしさを持っている。
やってみた
やってみました。 github.com
差分はこちら。
Comparing emilybache:master...ytnk531:master · emilybache/Tennis-Refactoring-Kata · GitHub
以下、やったことや感想を書いていきます。
TennisGame1
Comparing emilybache:master...ytnk531:master · emilybache/Tennis-Refactoring-Kata · GitHub
全体の流れは複雑では無いものの、条件分岐がif文が多くて流れがわかりにくくなっている印象。メソッドに切り出すだけでだいぶ改善した。
- scoreメソッドが長いので、とりあえずメソッド抽出した
- メッセージを出し分ける部分をメソッドに抽出して、文字列の加工を簡単にした
- 条件をメソッドにして、何を判定するのかわかるようにした
TennisGame2
Comparing emilybache:master...ytnk531:master · emilybache/Tennis-Refactoring-Kata · GitHub
文字列を生成するためにif文が並びまくっていて、とにかく流れが追いかけにくい。複数の条件に引っかかりながら進むパターンもあるので、条件分の前後関係も実は変えては行けなかったりする場所がある。わかりにくくいじりにくい凶悪なコード。
条件分岐をシンプルにしてやり、文字列の加工も単純にすることでだいぶ改善した。
score
メソッドの分岐を単純にした。- 重複した条件の場所を探してまとめた。
@p1points > @p2points
は実は3つの条件に当たっているのを見つけた。 - スコアの名前を取り出すのにif文を使っていて無駄が多いので、ハッシュから出すようにした。
TennisGame3
Comparing emilybache:master...ytnk531:master · emilybache/Tennis-Refactoring-Kata · GitHub
よくある、短くかくためにいろいろ省略しすぎて謎のコードになっているやつ。謎の数式があるので首をかしげる。
リファクタリングは、ロジックの改善よりはメソッド名や変数名を使ってコメントを付けるような感覚だった。もっとわかりやすくできた気がするが、あまり変えなくてもそこまでわかりにくくなかったので、ほどほどで手を止めた。
- 条件をメソッドに切り出した
- 数式での条件判定を変数に入れて名前をつけた
- 謎の変数にちょうどいい名前をつけた
感想
どれも頭が痛くなるコードだったが、TennisGame2がとにかく凶悪だった。こういうの、20~30分でかたづけられるといいんですけどねぇ。今回はテストがついていたのでとてもやりやすかったです。GildedRoseはテストも自分で書かないと行けなかったので。
他のアイディアややりかたについてもっと知りたいと思いました。きっともっといいやり方があるんだろうなぁという。こういうの一緒にできる知り合いがいるといいんですが、難しいですね。