我有这个方法:
public void validate(param1, pararm2, param3 ...) {
if(check1)
add error
return
if check2
add error
return
getDbObject
check3
exception
return
还有另一个用例,与上面的检查一起,如果传递了check1和check2,那么在check3之后应该返回db对象。 实现这个目标的最佳做法是什么?
我应该使用相同的检查编写一个新方法并在check3之后返回db对象,还是添加更多参数并简化现有方法?
我读过最佳实践是最多有5个参数,所以如果我们最后添加更多参数,第一个方法调用将有8-9个参数 如果我们减少参数的数量,那么每次调用都需要更多的检查(if-statements),这也是违反OOP的基本原则。 那么还有另一种解决方案吗?
答案 0 :(得分:1)
我只需用相同数量的参数重写方法并返回DbObject类型的值。 我们真的不明白这些检查是做什么的(他们检查对象的属性是否在参数范围内?..),但我会编写类似这样的代码:
public DbObjectType validate(param1, param2, ...) {
// if one of the checks fail, validation failed
if (check1 || check2 || ...checkN) {
add error;
return null;
}
else {
DbObject obj = getDbObject();
if (lastCheck) {
exception
return null;
}
return obj;
}
}
如果 if 之后执行的操作对于每个 相同,则不必将每个 if 放在单独的行上>。将它们链接在一起使代码更具可读性。 由于返回值为 DbObject ,因此返回 null 不会破坏程序,因为对象类型可以是 null 。< / p>
答案 1 :(得分:1)
我会重写使用Exceptions,故意返回null对调用者没有帮助,也许是这样:
public DbObjectType validate(param1, param2, ...) throws Check1FailedException, Check2FailedException, Check3FailedException {
check1();
check2();
check3();
return getDbObject();
}
private check1() throws Check1FailedException() {
//DoCheck and throw Exception if failed
}
private check2() throws Check2FailedException() {
//DoCheck and throw Exception if failed
}
private check3() throws Check3FailedException() {
//DoCheck and throw Exception if failed
}
答案 2 :(得分:1)
您可以应用策略模式。
public abstract void validate()
validate()
validate(param1, pararm2, param3 ...)
的类 ConcreteValidationA
validate()
的类 ConcreteValidationB validate(param1, pararm2, param3 ...)
以选择验证策略并调用相对validate()
转发方法。class Context {
/*... your methods and members */
public Context(){
//...
strategy=new ConcreteStrategyA(); //defalut strategy
private ValidationStrategy strategy;
public void validate(int param1, int param2,int param3){
if(param1<param2 && param1<param3)
strategy=new ConcreteStrategyA();
else
strategy=new ConcreteStrategyB();
strategy.validate();
}
}