somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【TDD】テスト駆動開発入門14章完了

14章完了しました。2フランを1ドルに換金できるように実装しました。

責務を考える

銀行にフランからドルへの換金レートを追加し、実際に換金するというテストを追加しました。

見出しにもあるとおり、Money自体がレートについて知っているのはおかしく、銀行がしっているべきです。レートに冠する責務は銀行がもっているということですね。

しかし、とりあえずレートの追加は仮実装しました。その後、換金をMoneyクラスに委譲している部分で行いました。つまり、すばやくグリーンバーにするために、レートの処理をMoneyでとりあえず簡単に実装しました。

テストがあるから、実装をスムーズに行えました。

実際に銀行に実装する

換金の仕様および、換金を実装している部分に銀行を(Bankクラス)を渡し、レートを銀行から取得できるようにします。

インターフェース、Money、Sum、テストコードの4つを修正します。その後、今回のテストコードのレート部分をBankクラスのメソッドとして抽出し、それを実行して完了です。

レートの重複を消去する

テストコードの期待値と、銀行に実装したレート取得部分の定数を消去します。(2フラン、1ドル部分)

銀行にレートを追加できるようにします。換金前の通貨の種類と換金後の通過の種類、レートを渡してレートを追加します。

phpでは、オブジェクトをキーとしたデータのマッピングができないので(同じオブジェクトを保持視しなくてはいけないため)、簡単に実装できるphp連想配列で実施しました。ただし、レートの集合はクラスとして実装しました。

<?php
class Rates {

    private $list = array();

    /**
     * レートの追加
     * @param String $from
     * @param String $to
     * @param integer $rate
     */
    public function put($from, $to, $rate) {
        $this->list[$from][$to] = $rate;
    }

    /**
     * レートの取得
     * @param String $from
     * @param String $to
     */
    public function get($from, $to) {
        return ($from === $to) ? 1 : $this->list[$from][$to];
    }
}

このレートを銀行のメンバ変数として持たせ、銀行がレートの追加と取得をレートに委譲しています。これで換金終了です。