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