我有这个方法:
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语句),这也违反了OOPs的基本原则。那么有没有其他的解决方案呢?
发布于 2018-02-24 15:53:11
我只需使用相同数量的参数和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都是相同的,那么您不必将每个if都放在单独的行上。将它们链接在一起可以提高代码的可读性。由于返回值为DbObject,因此返回null不会中断程序,因为对象类型可以是null。
发布于 2018-02-24 16:31:41
我会重写以使用异常,故意返回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
}发布于 2018-02-24 21:59:41
您可以应用策略模式。
代码定义一个ValidationStrategy接口,该接口公开方法public abstract void validate()
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();
}
}https://stackoverflow.com/questions/48960402
复制相似问题