マイペースなRailsおじさん

Ruby、Ruby on Rails、オブジェクト指向設計を主なテーマとして扱います。だんだん大きくなっていくRuby on Rails製プロダクトのメンテナンス性を損なわない方法を考えたり考えなかったりしている人のブログです。

Tennis-Refactoring-KataでRubyのリファクタリングの練習をやってみた

Refactoring Kataでリファクタリングを練習しています。今日も頑張りました。

Tennis-Refactoring-Kata

github.com

概要

  • テニスのスコアリングをするプログラムのリファクタリングを行う
  • テストは書いてある
  • 同じ仕様のプログラムが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はテストも自分で書かないと行けなかったので。

他のアイディアややりかたについてもっと知りたいと思いました。きっともっといいやり方があるんだろうなぁという。こういうの一緒にできる知り合いがいるといいんですが、難しいですね。