見出し画像

[書評] テスト駆動開発

積読していたTDD本を読みました。

第1部と第2部は実際に手を動かしやすいように書かれているのでそれに従って読み進めました。普段から使っているPHPで書いてみた。Composer苦手意識があったけど1からプロジェクトをinitしてみるのは面白かった。
https://github.com/shuntakeuch1/test-driven

PHPで書くのは既に実践されている方もいて、読み進める中でこの方のコードが参考になった。上手くいかない時とても手本になり、公開してくれてありがとうございます。shin1x1/book-tdd-php

「動作するきれいなコード」がテスト駆動開発のゴールでテスト駆動開発の2つのシンプルなルールがある。
- 自動化されたテストが失敗したときのみ、新しいコードを書く。
- 重複を除去する

このシンプルなルールはレッド・グリーン・リファクタリングの作業の順序として最後まで出てくる。「動作するきれいなコード」自分としても書いていて気持ちがよく、安心感があった。

書くべきテストを思いついた時にTODOを書く

設計は難しい。考えることを脳のメモリに置くより、書き出した方が集中できる。

三角測量は奇妙なやり方なので、どうやってリファクタリングしたら良いかまったくわからない時にしか使わない。
正しいコードがかける時に、それでもテストをもう一つ追加しなければコードを書いてはならないというのは少しおかしい。
しかし、設計のアイデアが浮かばないときは少し異なる角度から問題について考える機会を与えてくれる。

今までパターンとして余計なテストを書くことが多く、リファクタリングができていない。三角測量→リファクタリングは今後もっと深掘りしたい。

Mock Object
データベースがリモートにある場合ネットワークの問題も出てくる。クエリがただしかったら文字列をかえすようにする。価値は速度や信頼性だけでなく、その可読性にもある。なぜそれが正しい結果なのかは読み取れない。

DBなどでMock Objectを使う意味がわかっていなかった。リスクが多くなるだけと思っていた。リスクを軽減するためにクエリのテストの追加や本物のリソースが使える時にはMock Objectと簡単に切り替えられるようにしたい。

Log Stringパターン
正しい順序でメソッド呼び出しが行われていることをテストしたい時はどうすればよいだろうか
記録用文字列を作りメソッド呼び出しのたびにその文字列に追記するようにしよう。

プロダクションのコードに文字列を追記するコードを書くのはちょっと。。。

コード量はちょうど2倍になる開発時間より2倍書けるようになるか、コード量を半分に減らすか。

正直テストを書くことに慣れていないこともあって、作業量は4倍くらいになってる。しかしデグレが非常に少なくなったし、読みやすいコードが書けるようになってきたのでここも練習が必要。

TDDに学ぶプログラミングの難しさ

プログラミングスタイルに影響を与えるのが本書の狙い。
最終的にはテスト駆動開発を使わなくても全く問題はありません。優れたプログラミングテクニックやパラダイムは使いすぎてみて少し戻ってくるくらいがいい塩梅です。テストファースト、デザインパターン、リファクタリング、テスト駆動開発、モックオブジェクトGOOSスタイル、BDD、DDD、関数プログラミング、全て手を出してみて夢中になり、良いと思ったエッセンスを自分の中に残す。

t_wadaさんはライオンのスタンドが怖いけど優しさがにじみ出てるwwwこれは勉強した直後とかでその思想に傾倒し、若干イケてない、落とし込めてないコードをみたり書いたりすることでその手法に批判が生まれたりするので余計な争いを生まない良い言葉。私も何回も書き直してエッセンスをコードに落とし込みたい。

感想

第3部のテスト駆動開発パターンはデザインパターンやリファクタリング方法があり、レッド・グリーン・リファクタリングの作業を助けるリファレンスになると思う。
JavaでなくてPHPなどの他の言語で書くことも勉強になるなという気持ちがあった。これは新しい発見で今までサンプルが得意じゃない言語だとしたらスルーしてきたこともあったが翻訳することによって両方の言語を学ぶことができることを知った。
レッド・グリーン・リファクタリングの作業が冗長な気もしたが、今回写経することによってそのステップを学べたのは大きい。慣れたら粒度を大きくしたい。
「動作するきれいなコード」を書くのは大変で、プログラミングは難しいけど、コードを書くことに自信がついてきて本当に楽しくコード書けてるのは良い。

https://www.amazon.co.jp/dp/B077D2L69C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1


この記事が気に入ったらサポートをしてみませんか?