我想知道在某个帮助器方法运行之前有一个需要检查的变量时,最佳实践是什么。是否应该在来电者或被叫方进行检查?我看到两者都有好处。在调用方法中(在调用帮助器方法之前)这样做要便宜一些,但是这会将检查放在开发人员的肩膀上,如果代码切换(它会做),可能会丢失一些东西。因此,这是在被叫方中拥有它的好处。我的意思的一个非常粗略的例子是
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...
}
}
答案 0 :(得分:2)
您应该在init()
本身处理此问题。如果您的班级行为依赖于此变量,则不应让您的班级首先使用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...
}
这是因为,随着代码库的增长,在调用flag
之前,您无法检查null
是否在callee()
进行了{{1}}检查。这也符合DRY原则。
答案 1 :(得分:0)
在您的示例中,最好将被叫私有或至少受到保护,以尽可能减少对其的滥用。在使用敏感变量之前进行类似检查通常是一个好主意,但在某些情况下由于各种原因不切实际或不可行。
我想说我更喜欢在你的情况下办理callee
。
答案 2 :(得分:0)
最好检查一下被调用的方法。对象应该保证一致的状态。它可以通过以下示例轻松说明:假设您实现了Money类:
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对象不再可靠且代码难以维护