注意:TDD勉強会会用の資料です。
殴り書きしてあとで清書していくので投稿段階では綺麗ではありません。
TDDのサイクル
1テストを書く
欲しいインタフェースを想像する。物語には正しい答えを導くために必要そうな要素を全て取り込む。
2動かす。
きれいでシンプルな解が見えているならそのまま書く。
実装に手間がかかるならTODOリストに書き、動作するコードを手早く書き、動かす。
帯美的にも価値観的にも受け入れがたいかもしれないが、短い時間だけだが赦されるべし。
3正しくする。
ともかく動かすため汚い手を使ったなら悔い改め、 ソフトウェアの正道を通り、書いてしまった重複を除去。
アーメン
目指すのは、動作するきれいなコード。
ここは分割統治する。最初に「動作する」に取り組み、その後で「きれいな」に取り組む。
ではここからつづき。
問題
DOllarオブジェクトの状態が変化してしまう。
5ドルはもう5ドルではなく 10ドルになってしまった。amountの状態を初期状態のままに保ちたい。
こんな感じ
func TestMultiplication(){
var five = Dollar(5)
var Product:Dollar = five.times(2);
assert(Product.amount == 10)
print(Product.amount)
Product = five.times(3);
assert(Product.amount == 15)
print(Product.amount)
}
でも一章のコードではamountの状態が変わるので上のようにはならない。
それを改善しようという話。
最終的なコード
var money = MoneyTest()
money.TestMultiplication()
class MoneyTest{
init(){}
func TestMultiplication(){
var five = Dollar(5)
var Product:Dollar = five.times(2);
assert(Product.amount == 10)
print(Product.amount)
Product = five.times(3);
assert(Product.amount == 15)
print(Product.amount)
}
}
class Dollar {
var amount:Int
init(_ amount:Int){
self.amount = amount
}
func times(_ multiplire:Int) -> Dollar{
return Dollar(self.amount * multiplire)
}
}
この章では、正しいと思える実装をいきなり害いて、テストが通ることを祈った
普段TDDを行うときには、2つの実装モードの間を揺れ動くとのこと。
・仮実装:コードでまずベタ書きの値を使い、実装を進めるに従って、 徐々に変数に置き換えていく。
・明白な実装 :すぐに頭の中の実装をコードに落とす。
この章のふりかえり
・設計の問題点(今回は副作用)をテストコードに写し取り、その問題点のせいでテストが失敗するのを確認した。
・空実装でさっさとコンパイルを通した。
・正しいと思える実装をすぐに行い、テストを通した。