1部13枚で本当に作ります
21202 ワード
すべての重複データが削除されるまで、$5+$5テストに完了フラグが表示されません.
->コード重複はありませんが、重複データがあります.
重複を解消するために、まずテストを以下のように修正します.
1.鋳造(成形転換).このコードはExpressionに役立つはずです.
2.共通(public)フィールドとそのフィールドの2段階の参照.
これを訂正するには、以下のようにBankとSumを修正することができます.
Sumはreduce(String)を実現しているので、お金もそれを変えれば、reduce()もインタフェースに追加することができます.は、すべての重複除外の前にテストに合格しなかった. を実現するためには、逆ではなく順方向に進む. 以降に必要とされるオブジェクト(Sum)の生成を強制するために,テストを作成した. は迅速な実施を開始した.(Sumジェネレータ) は、まずcastingを用いて1つの場所でコードを実装し、その後、テストが戻るときにコードを適切な場所 に移動する.の明確な等級検査をなくすために多形性を用いた.
->コード重複はありませんが、重複データがあります.
// 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);
}
}
私たちは今まで.Reference
この問題について(1部13枚で本当に作ります), 我々は、より多くの情報をここで見つけました https://velog.io/@miiunii/1부-13장-진짜로-만들기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol