somemo's diary

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

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

今回は、8章オブジェクトの生成に関するメモです。

timesメソッドの戻り値をMoneyクラスに変更。phpのため型を意識しないので、実装していません。

存在を正当化するだけの動作を削除する と書いてありますが、一回読んだだけではよくわからないです・・・。 存在を正当化するをコードから判断すると、 Dollarオブジェクトの生成を表しているように見えます。

正当化するだけの動作を行っていないをコードから判断すると、 Dollarオブジェクトの生成をメソッドを介して行うようにすると考えられます。 つまり、書籍にもあるとおり、各クラスのインスタンス化をファクトリメソッドに置き換えよう。ということでした。

Moneyクラスの抽象化 リファクタリングの前にMoneyクラスの抽象化します。 加えて、timesメソッドも抽象化します。 Javaの場合では、timesメソッドのコンパイルエラーを通すために行っていますが、 本来は、実際に通貨として使用されるのは各サブクラスだからです。

また、timesメソッドも各サブクラスの総額を変更するためです。equalsメソッドに変更が無い理由は、通貨として総額を等しいかを判断するからです。

 

ファクトリメソッド

まず、ファクトリメソッドの戻り値の型はphpのため変更していません。 次に、Dollarクラスのテストケースで行っているオブジェクトの生成をファクトリメソッドに置き換えます。 置換後、テストを実行し通りました。 timesメソッドとequalsのテストケースを含む全ての生成部分を置換しました。

これにより、Dollarクラスの存在がMoneyクラスに隠され、テストコードとDollarの結合度が下がりました。 ※5ドルと6フランの比較テストを実装しました・・・前回実装し忘れたのは見落としです。

最後に、Francオブジェクトの生成部分もファクトリメソッドに置き換えて終了です。

 

今回行ったこと

・ファクトリメソッドによるクラスの分離と隠蔽 疑問点 ※TDDとは直接関係ないです

・Money、Dollar、Francおよびテストケースが1ファイルずつに分かれていないように思える

Javaでは、コンパイル時に使用するファイルが読み込んでいなければ、エラーとなるためだと思う

phpでは、実行時に使用するファイルをrequireなりで読みこむので、 実際のアプリではファイル名の規則性とautoloadに頼るためだと思う ・サブクラスの削除によるテスト不要(testFrancMuliplication)ということを言っているが、理由がさっぱりわからない・・・ 以上。