如何在不破坏DRY原则的情况下从界面检查方法中的参数

时间:2014-11-30 06:22:10

标签: java interface dry defensive-programming

我有以下代码:

public interface Person {
    /***
     *@Throws Exception x must be greater than 0 ****/
    setAge(int x);
}
public class Man implements Person {
    setAge(int x) {
        if(x <= 0) thrown new Exception("x <= ");
    }
}

我打破了DRY原则,因为我在每个单独的实现中重复检查,文档也重复了它。在这种情况下检查参数的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

鉴于它是一个接口,Java 7及更低版本中的接口不能包含任何实现,那么您已做出设计决策。您是否需要界面的刚性,还是可以使用抽象类?

如果你可以使用这个方法的抽象类,那么我建议这样做,因为它会使你更关心的值实现(和检索)更简单。

public abstract class Person {
    protected int age;

    public void setAge(int age) {
        if(0 > age) {
            throw new IllegalArgumentException("Age must be greater than 0");
        }
        this.age = age;
    }
}

通过上述实现,您不会 在子类中实现该方法,并且您不会冒重复自己的风险。

答案 1 :(得分:0)

在Java 8中,您可以使用默认方法

interface Person {

    default void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException();
        }
        // ...
    }

}

当实现Person时,默认方法 not 需要被覆盖,它在抽象类中充当非抽象方法,这可能是您之前需要考虑的事情继续你的设计。

答案 2 :(得分:0)

“检查参数”称为validation。有许多方法可以执行验证。保持DRY这样做并不容易,但这是可能的。这很困难,因为大多数设计都围绕着事情进展顺利的想法,而验证是关于他们何时出错。通常会使您处于验证为cross cutting concern的位置。也就是说,你的设计并不以验证为中心,而是你必须完成的另一件苦差事。

在不必重做设计的情况下实现验证(并保持DRY)的一种方法是使用Aspect Oriented Programming。如果您处于可以用以下规则描述的情况下最有用:“每次调用任何setAge()方法时,我们都需要确保它是正面的”。如果该规则需要在许多不同的类中,这些类不存在于允许您统一它们的任何结构中(例如,通过具有Age类),那么您可能希望查看AOP