首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有多个检查的void方法重构

带有多个检查的void方法重构
EN

Stack Overflow用户
提问于 2018-02-24 15:21:44
回答 3查看 233关注 0票数 3

我有这个方法:

代码语言:javascript
复制
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的基本原则。那么有没有其他的解决方案呢?

EN

回答 3

Stack Overflow用户

发布于 2018-02-24 15:53:11

我只需使用相同数量的参数和DbObject类型的返回值来重写该方法。我并不真正理解这些检查是做什么的(它们检查对象的属性是否在参数范围内?..),但我会编写类似这样的代码:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2018-02-24 16:31:41

我会重写以使用异常,故意返回null对调用者没有太大帮助,可能是这样的:

代码语言:javascript
复制
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
}
票数 1
EN

Stack Overflow用户

发布于 2018-02-24 21:59:41

您可以应用策略模式。

代码定义一个ValidationStrategy接口,该接口公开方法public abstract void validate()

  • Define类ConcreteValidationA,该类validate(param1, pararm2, param3 ...)

  • Define的行为实现方法代码,类ConcreteValidationB在上下文类(即您的方法所在的类)中添加对ValidationStrategy的引用并修改

  • ,以选择验证策略并通过转发调用相对的validate()方法。

<

  • >G223validate() >

上下文示例

代码语言:javascript
复制
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();
   }


}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48960402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档