Methods 使用TDD方法避免Java静态方法
我刚刚得到一些关于工作应用程序Java编码练习的反馈。他们不喜欢反馈中提到的解决方案和两个问题(我非常感谢,因为很少有反馈):Methods 使用TDD方法避免Java静态方法,methods,static,tdd,Methods,Static,Tdd,我刚刚得到一些关于工作应用程序Java编码练习的反馈。他们不喜欢反馈中提到的解决方案和两个问题(我非常感谢,因为很少有反馈): 显然,我没有使用TDD方法 我过度使用了静态方法,我知道静态方法是反OO的,但我只在验证和util类型方法中使用它们 这里有两个问题: 不使用TDD方法的可能迹象是什么 什么样的编码风格或模式可以替代静态方法 在前两个回答之后,我还有一个问题 您是否同意,只有当静态方法限制了代码的可测试性时,使用静态方法才是不好的,而静态方法本身并不坏 因此,如果静态方法不限制代码
- 显然,我没有使用TDD方法
- 我过度使用了静态方法,我知道静态方法是反OO的,但我只在验证和util类型方法中使用它们
非常感谢。不使用TDD的一个明显迹象是为协作者使用静态方法和静态类成员。您不能重写静态方法,因此您不能替换模拟来单独使用此类方法测试类
您可以使用依赖项注入,而不是在协作器上使用静态协作器或静态方法。在一个简单的编码练习中,您可以手动通过构造函数或setters注入依赖项。在现实生活中,你可以使用一个可用的依赖框架。你的静态
验证方法在我看来应该是对象的一部分
假设你有一门课饮料
public class Drink
{
private readonly string _name;
private readonly double _temperature;
public Drink(string name, double temperature)
{
_name = name;
_temperature = temperature;
}
}
您的业务逻辑将能够实例化各种饮料、七喜、可乐等。您希望确保饮料的温度适合饮用,因此需要使用Validate
方法。您可以遵循您的方法:
public void TakeAZip()
{
if (Validation.HasAppropriateTemp)
{
// implement drink
}
}
"
静态类的替代方案
这样,您就对静态验证类有了严格的依赖性
或者你可以利用
如果更方便的话,您还可以选择通过构造函数传递验证器
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;
}
现在,您可以更改验证器的行为,并且可以将Drink
类与所有外部行为隔离开来 谢谢奥拉夫,如果我有someBizObj.someBusinessMethod(SomeParam param);在这个方法中,我调用Validation.notNull(param,“pramName”);根据您的建议,您将如何更改此选项?+1表示答案@Ramo看下面的答案,了解一个简单的例子。希望它能有所帮助谢谢@bas,这样验证器就可以作为一个单例来实现,并根据需要进行传递。测试时,我们只模拟验证器接口并注入模拟。@Ramo-Hmm,您是否必须使用这个词…:)。单身汉不是你最好的朋友。如果你正在寻找一个关于单身的故事。阅读此线程作为参考
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;
}