假设您将系统划分为 Value 对象和 Services 对象(如“Growing Object-Oriented Software, Guided by Tests”中所建议的那样。Misko Hevery 称这些为“newables”和“injectables”。
当你的一个值对象突然需要访问服务来实现它的方法时会发生什么?
假设您有一个不错的简单 Value 对象。它是不可变的,包含一些信息,仅此而已。假设我们像这样使用它:
CreditCard card = new CreditCard("4111-1111-1111-1111", "07/10");
if (card.isValid())
{
// do stuff
}
else
{
// don't do stuff
}
到现在为止还挺好。 isValid()
对卡号实现校验位算法并返回真/假。
现在,假设我希望通过根据当前时间验证到期日期来增强系统。您如何建议在不破坏 Value 对象/Service 对象范式的情况下完成此操作?我希望这个类继续是可单元测试的。
CreditCard
现在有一个依赖,但是由于它的创建方式不能被注入,所以依赖注入已经淘汰了。CreditCard
班级不应该呼唤单身人士(我认为全局访问单身人士是不好的做法)- 启用该行为
CreditCardVerificationService.validateCard()
意味着必须重新访问所有现有代码。isValid() 的实现正在泄漏。
我知道可以做一些事情来解决这个问题,但是最干净的方法是什么?