1部13枚で本当に作ります

21202 ワード

すべての重複データが削除されるまで、$5+$5テストに完了フラグが表示されません.
->コード重複はありませんが、重複データがあります.

// Bank
public class Bank {
    Money reduce(Expression source, String to) {
        return Money.dollar(10);
    }
}

  @Test
   public void testSimpleAddition() {
        Money sum = Money.dollar(5).plus(Money.dollar(5));
        assertEquals(Money.dollar(10), sum);
        Money five = Money.dollar(5);
        Expression sum = five.plus(five);
        Bank bank = new Bank();
        Money reduced = bank.reduce(sum, "USD");
        assertEquals(Money.dollar(10), reduced);
    }
銀行の金.dollar()部分とtestのfive.プラス記号の部分は同じです.
重複を解消するために、まずテストを以下のように修正します.
 @Test
    public void testSimpleAddition() {
        Money five = Money.dollar(5);
        Expression result = five.plus(five);
        Sum sum = (Sum) result;
        assertEquals(five, sum.augend);
        assertEquals(five, sum.added);
    }
augdendフィールドとadddendフィールドを持つsumクラスが必要です.
public class Sum {
    Money augend;
    Money addend;
}
Money.plus()はsumのmoneyではないので、次の変更が必要です.

Expression plus(Money addend) {
        return new Sum(this, addend);
   }
Sumクラスにジェネレータを追加し、Expressionを実装します.
public class Sum implements Expression{
    Money augend;
    Money addend;

    public Sum(Money augend, Money addend) {
        this.augend = augend;
        this.addend = addend;
    }
}
テストは次のように変更できます.
 @Test
    public void testSimpleAddition() {
        Expression sum = new Sum(Money.dollar(3), Money.dollar(4));
        Bank bank = new Bank();
        Money result = bank.reduce(sum, "USD");
        assertEquals(Money.dollar(7), result);
    }
Bankのreduce構文もそれに応じて修正されます.
public class Bank {
    Money reduce(Expression source, String to) {
        Sum sum = (Sum) source;
        int amount = sum.augend.amount + sum.addend.amount;
        return new Money(amount, to);
    }
}
しかし、このコードには2つの原因があります.1つは雑然としたコードです.
1.鋳造(成形転換).このコードはExpressionに役立つはずです.
2.共通(public)フィールドとそのフィールドの2段階の参照.
これを訂正するには、以下のようにBankとSumを修正することができます.
// Bank
public class Bank {
    Money reduce(Expression source, String to) {
        Sum sum = (Sum) source;
        return sum.reduce(to);
    }
}

// Sum
public class Sum implements Expression{
    Money augend;
    Money addend;

    public Sum(Money augend, Money addend) {
        this.augend = augend;
        this.addend = addend;
    }

    public Money reduce(String to) {
        int amount = augend.amount + addend.amount;
        return new Money(amount, to);
    }
}
次のテストを作成して、正常に動作しているかどうかを確認します.
@Test
    public void testReduceMoney() {
        Bank bank = new Bank();
        Money result = bank.reduce(Money.dollar(1), "USD");
        assertEquals(Money.dollar(1), result);
    }
よく動いていますが、まだ散らかっています.
Sumはreduce(String)を実現しているので、お金もそれを変えれば、reduce()もインタフェースに追加することができます.
// Money
public Money reduce(String to) {
        return this;
    }
    
// Expression
public interface Expression {
    Money reduce(String to);
}

// Bank
public class Bank {
    Money reduce(Expression source, String to) {
       return source.reduce(to);
    }
}
私たちは今まで.
  • は、すべての重複除外の前にテストに合格しなかった.
  • を実現するためには、逆ではなく順方向に進む.
  • 以降に必要とされるオブジェクト(Sum)の生成を強制するために,テストを作成した.
  • は迅速な実施を開始した.(Sumジェネレータ)
  • は、まずcastingを用いて1つの場所でコードを実装し、その後、テストが戻るときにコードを適切な場所
  • に移動する.
  • の明確な等級検査をなくすために多形性を用いた.