フロントエンジニアのメモ

普段フロントエンジニアしているやつが思ったことや書き残したいこと

テスト駆動開発「第1部 多国通貨 10章~13章」を読んだまとめ

f:id:tf6533:20171218131107j:plain

現在友人達とテスト駆動開発の本を輪読しているので、自分の担当した「第1部 多国通貨 10章~13章」の内容をアウトプットとしてブログにまとめる。

おさらい

いきなり10章~13章の内容をまとめても訳がわからないとおもうので、まずはこれまでの章についてざっくりおさらいする。

「第1部 多国通貨」の内容はある多国通貨についてJavaで実装する際に、必要な機能をTDD手法で実装していくことになる。

本の中ではJavaの実コードを参照しつつ、TDDについて触れているのですが、今回の私がおさらいする内容は、主にTDDについての考え方についてになる。
Javaの実コードを見たい方は書籍を買うと良いだろう。

TODOリストを作る(1章参照)

TODOリストを作ればやるべきことを忘れずに目の前のことに集中できる。
書くべきテストを思いついた時にその都度TODOリストに追記する。

TDDのサイクル(2章参照)

1.小さいテストを1つ書く。
2.すべてのテストを実行し、1つ失敗することを確認する。
3.小さい変更を行う。
4.再びテストを実行し、すべて成功することを確認する。
5リファクタリングを行い、重複を除去する。

TDDの目指すべきところは動作する綺麗なコード

TDDで大事なのは細かいステップを踏むのではなく、 細かいステップを踏み続けれるようになること。

1~3のフェーズは速度(似たコードのコピペなども可)を重視して、通過する。
しかし、それは5のフェーズを行わなければ罪である。

TDDの3つの戦略(2〜3章参照)

  • 仮実装
    コードでまずベタ書きの値を使い、実装を進めるに従って、徐々に変数に置き換えていく。

  • 明白な実装
    すぐに頭の中の実装をコードに移す。

  • 三角測量

リファクタリングの前にテストを書く(5章〜6章参照)

テストが十分に書かれていないコードに対してTDDを行うことも考えられる。

この場合は、あればよかったテストを書いてからリファクタリングを行う。もし、テストを書かずにリファクタリングを行えば、コードはリファクタリングの過程で壊れてしまう。

不安だと思った内容はテストに書く(7章参照)

頭の中にある不安はTODOに追記して、テストコードにする。

このテストコードに対して、テストを通す目的だけの実装をする、完璧な実装はそのあとに考えることにする。

歩幅を調整する(8章参照)

実装をする際に大きな変更を加える前に、それを小さな手順にして小さく実装することを検討する。

TDDを行う際にはこのように、歩幅の調整が必要であり、大きな変更をすることに不安を感じれば、小さな変更に分割し、小さな変更に窮屈さを感じれば大きくするといった感じで、微調整を繰り返す。
ちなみに 正しい歩幅は未来永劫存在 しないらしい。

本題

おさらいが終わったので、本題の10章~13について解説していきます。

10章 テストに聞いてみる

コードをリファクタリングしているときに「ここの部分は必要なさそうだけど消しても問題ないのか?」という場面があると思う。

この場合、テストを実装していればどのような変化を加えても、変更後にテストを実行すれば動作するかどうかの結果をコンピュータが即座に教えてくれる。
もしテストがなければ、リファクタリングに慎重になり、検討に時間がかかってしまう。

1つのテストが失敗しているときに、新たにテストを加えたり、プロダクトコードを変更することは危ないことなので、この場合は1度テストが失敗した原因まで戻り、新たにテストを加えて実装を修正し、再び今回テストが失敗した内容に戻るのが良い。

11章 不要になったら消す

2つの重複があった関数やクラスを1つにまとめると、不要な関数やクラスができる。
同時に不要な関数やクラスを参照してるテストコードもできる、不要な実装に対してのテストは 過剰なテスト ということになるので、削除してしまう。

12章 設計とメタファー

この章で「メタファー」という言葉が多く登場するのだが、意味がよくわからなかったので、wikipediaを参照しました。要は比喩のようなものらしい。

新たに大きなテストを書いて実装をする前に、小さなテストに分割し作成し、その小さなテストが通るようなメタファーについて深く考える。
新たなメタファーが思いついたらそのテストが通るところまでは、素早く実装し、リファクタリングができる準備をする。

13章 実装を導くテスト

この章では寿命の短いとわかっているテストをあえて書いている。
内部の実装に関するテストは寿命が短いがこのテストを通すことで、リファクタリングを自信持って進めることができるということなのだと思う。

あとは書いたテストを通るようにして、リファクタリングを加えるといった内容だった。 しかし、この章でのリファクタリングではテストは通っているものの重複している部分が残っているので、TODOに追加した項目は残すようにしている。

感想

この本の中ではTDDについてJavaのコードを用いながら解説しているが、Javaを知らない人でもTDDについては学べそうだと感じた。
まだ本の中では3分の1程度の内容なので、更に読み進めて続きを後日あげようと思う。

まだ理解が浅いのでもし間違っている点ありましたら教えてください🙇