Part 1-3
Value Object
- Dollar実装で使用しているパターン
- オブジェクトを値として使用する
- インスタンス変数の値をコンストラクタ内で設定した後は変化させないという制約
- 別名参照のバグを防ぐ
- Dollar5が別のDollar5オブジェクトと等価であることを示すためにequals()を実装する必要がある
- equals()実装に合わせてhashCode()の実装も必要
TODOList.md
レートが2:1の場合、$5+10CHF=$10
amountのプライベート化
Moneyの丸め処理
equals()
hashCode()
- 新しいテスト
DollarTest.java
@Test
public void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
}
- 仮実装
Dollar.java
public boolean equals(Object object){
return true;
}
- テストパターンを増やす
DollarTest.java
@Test
public void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
assertFalse(new Dollar(5).equals(new Dollar(6)));
}
Dollar.java
public boolean equals(Object object){
Dollar dollar = (Dollar)object;
return amount == dollar.amount;
}
- nullやその他オブジェクトとの比較をどうするかという問題がでてきたのでTODOListに加えておく
TODOList.md
レートが2:1の場合、$5+10CHF=$10
amountのプライベート化
Moneyの丸め処理
hashCode()
nullとの等価性
オブジェクトとの等価性
三角測量云々の話がよく理解できてない...
この章で行ったこと
操作に対するテスト
操作の実装
テストとリファクタリング
Part 1-4
変数のプライベート化
- テストの修正
DollarTest.java
@Test
public void testMultiplication(){
Dollar five = new Dollar(5);
assertEquals(new Dollar(10),five.times(2));
assertEquals(new Dollar(15),five.times(3));
}
- これでインスタンス変数をプライベートにすることができるようになった
Dollar.java
private int amount;
この章で行ったこと
テストの改善
テストとコードの結合度を削減
DollarTest.java
public class DollarTest {
@Test
public void testMultiplication(){
Dollar five = new Dollar(5);
assertEquals(new Dollar(10),five.times(2));
assertEquals(new Dollar(15),five.times(3));
}
@Test
public void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
assertFalse(new Dollar(5).equals(new Dollar(6)));
}
}
Dollar.java
class Dollar {
private int amount;
Dollar(int amount){
this.amount = amount;
}
Dollar times(int multiplier){
return new Dollar(amount * multiplier);
}
public boolean equals(Object object){
Dollar dollar = (Dollar)object;
return amount == dollar.amount;
}
}