[Book]TDD,Kentbeck 1部分通貨例


開発テスト主導


テスト主導開発の究極の目標:簡潔なコードを実行する


基準:
  • は、開発方法を予測することができる.絶えず起こる過ちを心配する必要はなく、いつ終わるかを知ることができます.
  • コードで教えられたすべての教訓を学ぶ機会があります.最初に何かを考えてすぐに完成すれば、2つ目の、もっと良いことを考える機会があります.
  • あなたが作ったソフトウェアはユーザーの生活を向上させることができます.
  • あなたの同僚たちにあなたを尊敬させ、あなたもあなたの同僚たちを尊敬することができます.
  • と書いている間は気持ちよかったです.
  • ルール:
  • は、自動化テストに失敗したときにのみ新しいコードを記述します.
  • 重複除外.
  • 本を読み終える:
  • 簡単入門、
  • 自動化テストを作成し、
  • は、新しい設計決定を一度に導入するために再設計する準備をする.
  • 第一部。通貨の例


    ソースリンク

    TDDのリズム

  • テストをすばやく追加します.
  • すべてのテスト
  • を実行し、新しく追加されたテストが失敗したことを確認します.
  • コードを少し変更します.
  • すべてのテストを実行し、すべてが成功したことを確認します.
  • で再包装して重複を解消します.
  • 驚くべきハイライト

  • 各テストは、機能の小さな増分
  • をどのようにカバーするかをテストする.
  • 新しいテストを回帰させるために、どれだけ小さくて醜い変更ができますか?
  • テストを実行する頻度は
  • です.
  • は、無数の小さなステップによって、
  • を再構成する.

    第1章。複数通貨をサポートする金銭オブジェクト


    Money Class
    事業株価合計IBM 10002000 GE 4001004000合計65000
    複数の通話をサポートする金銭類
    事業株価合計IBM 100025 USD 25000 USDGE 4005150 CHF 60000 CHF合計65000ドル
    為替レートカテゴリ
    基準換算レートCHFUSD 1.5

    必要なテスト

  • 通貨は、他の2つの金額を加え、与えられた為替レートの変化に応じて得られる金額を加算しなければならない.
  • ある金額(株価)にある数量(株の数量)を乗じた金額は結果を得ることができる.
  • 할 일
    
    $5 + 10CHF = $10 (환율이 2:1일 경우)
    $5  x 2  = $10
    amount를 private으로 만들기
    Dollar 부작용?
    Money 반올림?

    金銭レベルとテストの作成

  • Money Class
  • MoneyTest

  • 実行されたタスク

  • には、私たちが知っている仕事のテストリストが記載されています.
  • 製品が外部でどのように表現したいかをコードで表現した.
  • JUnitの詳細
  • を一時的に無視
  • スタブによるテストコンパイル
  • サイクルコードでは、定数を変数に変更し、
  • を逐次汎用化する.
  • は新しい待機事項を処理せず、抗日カタログに追加した.
  • 第二章。堕落の対象


    典型的なTDDサイクル

  • テストを作成します.ストーリーを作成します.必要なインタフェースを開発します.
  • 、必要なすべての内容を含めて、正しい答えを得る
  • を可能にします.早く緑の欄を見てきれいで簡単なものがはっきり見えたら実行し、そうでなければ問題を解決するために書いておきます.
  • を正しくします.罪を捜し取る.重複データを削除し、緑のバーに戻ります.
  • まず、正常に動作し、清潔なコードのアクティビティを解決します.
    할 일
    
    $5 + 10CHF = $10 (환율이 2:1일 경우)
    ~~$5  x 2  = $10~~
    amount를 private으로 만들기
    Dollar 부작용?
    Money 반올림?

  • 仮象として実装される:定数を戻し、真のコードが得られるまで定数を徐々に変数に変換する.
  • を使用して明確な実装:実際の実装を入力します.
  • 第三章。人はみな平等である

    할 일
    
    $5 + 10CHF = $10 (환율이 2:1일 경우)
    ~~$5  x 2  = $10~~
    amount를 private으로 만들기
    ~~Dollar 부작용?~~
    Money 반올림?
    **equals()**
    hashCode()
    Equal null
    Equal object
    緑のバーの3つ目のポリシーを表示します.
  • 三角測量:2つの例がある場合、
  • 構成を比較

    第四章。プライバシー


    一時変数productを削除すると、一連の操作ではなく、実際の命題に対する断言であるため、私たちの意図はより明確になります.
    Dollarのamountインスタンス変数を使用するコードはDollar自身だけです.したがって、変数をprivateに変更できます.
    やるべきこと
    $5+10 CHF=$10(為替レートが2:1の場合)
    $5 x 2 = $10
    amountをプライベートにする
    ドルの副作用?
    金は四捨五入?
    equals()
    hashCode()
    Equal null
    Equal object

    第五章。Franc-ly Speaking


    やるべきこと
    $5+10 CHF=$10(為替レートが2:1の場合)
    $5 x 2 = $10
    amountをプライベートにする
    ドルの副作用?
    金は四捨五入?
    equals()
    hashCode()
    Equal null
    Equal object
    5CHF x 2 = 10CHF
    $5+10 CHF=$10(レートが2:1の場合)にアクセスするには、まずFrancクラスを作成します.Dollarクラスをコピーし、Francクラスを作成すれば解決します.

    第六章。すべての人の平等のために


    共通equals
    DollarとFrancは共通の機能を持っている.上位クラスを使用してequals機能を再構築します.
  • は汎用コードをDollarからより高いレベルのMoneyに移行した.
  • Francもmoneyのサブクラスです.
  • 2つのエラー()のインプリメンテーションは、
  • の不要なインプリメンテーションを除去する前にマッチングされる.
  • 第七章。りんごとオレンジ


    FrancとDollarの比較
    質問:assertFalse(new Franc(5).equals(new Dollar(5)));に失敗しました.
    DollarとFrancの違いを作ります.
    && getClass().equals(money.getClass());
    equalsにはクラス比較の条件も追加されています.
  • 通貨単位を加算できますが、動機が不足し、まだ設計されていません.
  • 第八章。オブジェクトの作成


    Dollar/Franc冗長
    2つの実装は同じです
    class Money{
    	static Dollar dollar(int amount){
        	return new Dollar(amount);
    	}
        
        static Franc franc(int amount){
            return new Franc(amount);
        }
    }    
  • は、同じ時間()の2つの変異メソッド署名子(ドル、Franc->Money)を統一することによって、重複データ除去
  • に近い.
  • は少なくとも方法宣言部の共同上級に移った.
  • 第九章。私たちが暮らす時間


    通話.
    テスト単位がカーソルにエラーが発生した場合、減少できるはずです.
    class Money{
    	static Money dollar(int amount){
        	return new Dollar(amount, "USD");
    	}
    }    
    class Dollar{
        private String currency;
        
        Dollar(int amount, String currency) {
            this.amount = amount;
            this.currency = currency;
        }
       
        Money times(int multiplier) {
            return Money.dollar(amount * multiplier);
        }
        
    }
  • の大きなデザインアイデアを処理するとき、問題が発生したら小さくします.
  • 他の部分を呼び出し者に移動し、2つの構造関数を
  • に一致させる.
  • 回()再包装を停止し、工場方法
  • を使用する.
  • 同じ作成者をより高いレベルの
  • に移動

    第十章。おもしろい時間


    きょうようじかん
    FrancおよびDollarで実装されたtimes()メソッドを親に移動するには、ジェネレータを金銭に変更します.
    equalsは、クラスを比較せずに通貨を比較するように設定されました.

    第11章。万悪の源


    Dollar/Franc冗長
    Dollar、Francクラスにはジェネレータのみが存在するため、削除できます.
    moneyクラスのみを保持し、残りのクラスを削除します.
  • サブクラスの検索を完了し、サブクラス
  • を削除する
  • 新しいソース構造から不要なテスト
  • を削除する.

    第12章。とうとう


    $5+$5 = $10
    簡単な加算を実施する前に、計算に必要な比喩を慎重に考えてください.
    複雑で直感的な問題を解決するためにクラスを作成してテストを実装

    第13章。本当に


    $5+$5 = $10
  • すべての重複データが消去されるまでテストに合格しなかった
  • Sum Classを生成するためのテストが作成されました.
  • 多形除去
  • を用いた明示的クラス試験
  • 第14章。置換


    通貨換算用のReduce
  • コードとテスト間の重複データが消去されました.
  • は、他のテストなしにプライベートアシスタントクラスを作成します.
  • 第15章。異なる通貨の追加


    $5+10 CHF=$10(為替レートが2:1の場合)
  • ウォンのテストを作成し、一歩後退して完成させた.
  • ExpressionFiveBuckに変更した後、コンパイラの指示に従って影響を受ける他の部分を変更します.
  • 第16章。抽象画


    Expression.プラスを終了するにはSumplusを実装し、Expressionを使用する必要があります.実装times()で完了しました.

    第17章。金銭の回顧


    プロセス:

  • の小さなテストを追加します.
  • すべてのテストを実行し、失敗を確認します.
  • コードを変更します.
  • は、すべてのテストを実行し、成功したことを確認します.
  • の重複データを排除するために再パッケージされます.