寺田さんのコードをリファクタリングしてみました。

リファクタリングの詳しい動機は各コミットのコメントに書いています。