Methods 使用TDD方法避免Java静态方法

Methods 使用TDD方法避免Java静态方法,methods,static,tdd,Methods,Static,Tdd,我刚刚得到一些关于工作应用程序Java编码练习的反馈。他们不喜欢反馈中提到的解决方案和两个问题(我非常感谢,因为很少有反馈): 显然,我没有使用TDD方法 我过度使用了静态方法,我知道静态方法是反OO的,但我只在验证和util类型方法中使用它们 这里有两个问题: 不使用TDD方法的可能迹象是什么 什么样的编码风格或模式可以替代静态方法 在前两个回答之后,我还有一个问题 您是否同意,只有当静态方法限制了代码的可测试性时,使用静态方法才是不好的,而静态方法本身并不坏 因此,如果静态方法不限制代码

我刚刚得到一些关于工作应用程序Java编码练习的反馈。他们不喜欢反馈中提到的解决方案和两个问题(我非常感谢,因为很少有反馈):

  • 显然,我没有使用TDD方法
  • 我过度使用了静态方法,我知道静态方法是反OO的,但我只在验证和util类型方法中使用它们
这里有两个问题:

不使用TDD方法的可能迹象是什么

什么样的编码风格或模式可以替代静态方法

在前两个回答之后,我还有一个问题

您是否同意,只有当静态方法限制了代码的可测试性时,使用静态方法才是不好的,而静态方法本身并不坏

因此,如果静态方法不限制代码的可测试性,那么返回到我的工作应用程序练习解决方案,使用它仍然不好吗?我的验证方法是非常简单的“Validator.notNull(p,“paramName”)”,现在我为什么要嘲笑它呢


非常感谢。

不使用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;
    }