システムを値オブジェクトとサービス オブジェクトに分割すると仮定します (「テストによって導かれるオブジェクト指向ソフトウェアの成長」で提案されているように)。
値オブジェクトの 1 つが突然サービスにアクセスしてそのメソッドを実装する必要がある場合はどうなりますか?
素敵でシンプルな Value オブジェクトがあるとしましょう。それは不変で、いくつかの情報を保持しています。それだけです。次のように使用するとしましょう。
CreditCard card = new CreditCard("4111-1111-1111-1111", "07/10");
if (card.isValid())
{
// do stuff
}
else
{
// don't do stuff
}
ここまでは順調ですね。 isValid()
カード番号にチェック ディジット アルゴリズムを実装し、true/false を返します。
ここで、現在の時刻に対して有効期限を検証することでシステムを強化したいとしましょう。値オブジェクト/サービス オブジェクトのパラダイムを壊さずにこれを行うにはどうすればよいでしょうか? このクラスが引き続き単体テスト可能であってほしいと思います。
CreditCard
現在は依存関係がありますが、作成方法が原因で注入できないため、依存性注入はアウトです。- クラスはシングルトンを呼び出すべきではありません(
CreditCard
シングルトンへのグローバルアクセスは悪い習慣であるという立場です) - 動作をオンに
CreditCardVerificationService.validateCard()
するということは、既存のすべてのコードを再検討する必要があることを意味します。isValid() の実装がリークしています。
これを回避するためにできることがあることは知っていますが、最もクリーンな方法は何ですか?