在方法之前或方法内部检查因变量的最佳实践

Best Practice for Checking Dependent Variables Before or inside Method

我想知道当您有一个变量需要在某个辅助方法可以 运行 之前检查时,最佳实践是什么。检查应该在呼叫者或被呼叫者中完成吗?我看到两者都有好处。在调用者方法中(在调用辅助方法之前)执行此操作的成本要低一些,但这会将检查放在开发人员的肩上,如果代码切换手(它会这样做),可能会丢失一些东西。因此,这就是在被调用者中拥有它的好处。下面是我的意思的一个非常粗略的例子

public class TestClass implements TestInterface {

    private String dependentVariable = null;

    public TestClass(arg1) {
    }

    @Override
    public void init(String flag) {
        this.dependentVariable = flag;
        caller();
    }

    public void caller() {
        //do it here?
        if(this.dependentVariable != null)
            callee();
    }

    public void callee() {
        //or do the check here?
        // do stuff involving the dependentVariable...
    }

}

在您的示例中,将被调用者设为私有或至少受保护是个好主意,以尽量减少可能的误用。在使用敏感变量之前进行这样的检查通常是个好主意,但在某些情况下由于各种原因不切实际或不可行。

我会说我更愿意在您的情况下办理登机手续 callee

您应该在 init() 中自行处理。如果你的 class 行为依赖于这个变量,你不应该让你的 class 首先用 null 初始化。

@Override
public void init(String flag) {
    if (flag == null)
        throw IllegalArgumentException("Flag cannot be null");
    this.dependentVariable = flag;
    caller();
}

如果没有 flag 是可以的并且应该抢占 callee() 的执行,它应该在 callee() 本身内处理。

public void callee() {
    if (flag == null) return;
    // do stuff involving the dependentVariable...
}

这是因为,随着代码库的增长,您将无法在调用 callee() 之前检查 flag 是否在所有地方被 null 检查。这也符合 DRY 原则。

最好在调用的方法内部进行检查。该对象应保证一致的状态。可以通过以下示例轻松说明:假设您实现了一个 Money class:

public class Money {
    private final BigDecimal value;

    private Money(BigDecimal value) {
        this.value = value;
    }

    public static Money valueOf(BigDecimal value) {
        return new Money(value);
    }

    public BigDecimal getValue() {
        return value;
    }
}

合同规定货币价值必须为正。因此,如果您将责任传递给客户以检查用于构建 Money 的值是否为正,则您允许某人构建具有非正值的 Money,那么您的 Money 对象将不再可靠并且代码更难维护.