我刚收到一些关于求职应用程序Java编码练习的反馈。他们不喜欢这个解决方案和反馈中陈述的两个问题(我非常感激,因为这是非常罕见的反馈):
这里有两个问题:
不使用TDD方法有什么可能的迹象?
哪种编码风格或模式可以替代静态方法?
在前两个回复之后,我有另一个问题。
您是否同意使用静态方法只会在限制代码的可测试性时出现问题,而不是在自身方法中出现问题。
如果静态方法不限制我的代码的可测试性,那么回到我的求职应用练习解决方案是否仍然不好用?我的验证方法非常简单'Validator.notNull(p,“paramName”)''为什么我想要嘲笑它?
非常感谢。
答案 0 :(得分:3)
不使用TDD的告示标志是对协作者使用静态方法和静态类成员。您不能覆盖静态方法,因此您无法替换模拟以单独使用此类方法来测试类。
您可以使用依赖项注入,而不是在协作者上使用静态协作者或静态方法。在一个简单的编码练习中,您将通过构造函数或通过手动设置器注入依赖项。在现实生活中,您可以使用一个可用的依赖框架。
答案 1 :(得分:2)
您的静态Validaton
方法似乎应该成为我对象的一部分。
假设你有一个班级Drink
public class Drink
{
private readonly string _name;
private readonly double _temperature;
public Drink(string name, double temperature)
{
_name = name;
_temperature = temperature;
}
}
您的businesslogic将能够实例化各种饮料,7up,可乐等等。您想确保饮料具有适当的饮用温度,因此您需要采用Validate
方法。你可以按照你的方法:
public void TakeAZip()
{
if (Validation.HasAppropriateTemp)
{
// implement drink
}
}
这样你就会对你的静态Validation
类产生强烈依赖。
或者,您可以使用dependency injection。
public void TakeAZip(ITemperatureValidator validator)
{
if (validator.HasAppropriateTemp)
{
// implement drink
}
}
如果更方便,您也可以选择通过构造函数
传递Validator
private readonly string _name;
private readonly double _temperature;
private ITemperatureValidator _validator;
public Drink(
string name,
double temperature,
ITemperatureValidator validator)
{
_name = name;
_temperature = temperature;
_validator = validator;
}
现在您可以mock验证者的行为,您可以将Drink
类与所有外部行为隔离开来。