#13 Today's Moku-Moku by Fujita 今日の始まり
https://gyazo.com/8d849cfd9d4fcf8f43ceac8354368b56
恒例の、本がどこまで終わったのかわからない。
記憶が全くないぞ・・・、困った。
どうやら22ページまで終わっていたようだ、再開!!
意図を語るテスト
code:MoneyTest.cs
public void Dollar5に2をかけたらDollar10を返す()
{
Dollar five = new Dollar(5);
Dollar product = five.Times(2);
Assert.Equal(10, product.amount);
product = five.Times(3);
Assert.Equal(15, product.amount);
}
このテストコードでは、自身の金額とmultiplier引数をかけた値を保持するDollarを返しているということが伝わりにくい。
最初のアサーションを修正して、Dollar同士を直接比較することにする。
Before → After
code:MoneyTest.cs
public void Dollar5に2をかけたらDollar10を返す()
{
Dollar five = new Dollar(5);
Assert.Equal(new Dollar(10), five.Times(2))
Assert.Equal(new Dollar(15), five.Times(3));
}
ActualにDollarを指定することで、Dollarを期待しているということがわかるようになった。
そして、amountフィールドを使うのは、Dollarクラスだけになったので、フィールドをprivateに変更できる。
Before
code:Dollar.cs
public class Dollar
{
public int amount;
public Dollar(int amount)
{
this.amount = amount;
}
public Dollar Times(int multiplier)
{
return new Dollar(amount * multiplier);
}
public override bool Equals(Object obj)
{
Dollar dollar = (Dollar)obj;
return amount == dollar.amount;
}
}
After
code:Dollar.cs
public class Dollar
{
private int amount;
public Dollar(int amount)
{
this.amount = amount;
}
public Dollar Times(int multiplier)
{
return new Dollar(amount * multiplier);
}
public override bool Equals(Object obj)
{
Dollar dollar = (Dollar)obj;
return amount == dollar.amount;
}
}
"amountをprivateにする"を倒した!
https://gyazo.com/0d97589145eef7f41c334101a4771f46
Important
もしも等価性比較のテストが、等価性比較が正確に実装されていることを検証できていなかったのならば、掛け算のテストもきちんと掛け算ができていることを検証できていないということになる。
今日、心に残った一言
私たちは、完璧を求めているのではない。
勇しくはためくグリーンバーの旗の下で、大胆に歩みを進める。
ベロシティ:23 - 28. 5ページ