リファクタリングしてみました

小林さんのコードをリファクタリングしてみました。
コミットログを順番に追っていくと、何をどういう目的で変更したのかがわかるはずです。
不明な点があれば聞いてください。