void方法使用多个检查进行重构

时间:2018-02-24 07:21:44

标签: java refactoring

我有这个方法:

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的基本原则。 那么还有另一种解决方案吗?

3 个答案:

答案 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)

您可以应用策略模式。

  1. 定义公开方法public abstract void validate()
  2. ValidationStrategy 界面
  3. 使用validate()
  4. 的行为定义实现方法validate(param1, pararm2, param3 ...)的类 ConcreteValidationA
  5. 使用替代方法的行为定义实现方法validate()的类 ConcreteValidationB
  6. 在Context类(即您的方法所在的类)中添加对 ValidationStrategy 的引用,并修改validate(param1, pararm2, param3 ...)以选择验证策略并调用相对validate()转发方法。
  7. 上下文示例

    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();
       }
    
    
    }