【问题标题】:How to tidy up too many if statements for readability如何整理过多的 if 语句以提高可读性
【发布时间】:2009-10-30 11:22:08
【问题描述】:

我有一个我经常在网站上看到的代码示例,我想改进这些代码并希望得到一些帮助。我经常在 page_load 方法中看到 5-10 个嵌套 if 语句,旨在消除无效的用户输入,但这看起来很难看,而且难以阅读和维护。

您建议如何清理以下代码示例?我要消除的主要内容是嵌套的 if 语句。

string userid = Request.QueryString["userid"];

if (userid != ""){
    user = new user(userid);

    if (user != null){
        if (user.hasAccess){
            //etc.
        }
        else{
            denyAccess(INVALID_ACCESS);
        }
    }
    else{
        denyAccess(INVALID_USER);
    }
}
else{
    denyAccess(INVALID_PARAMETER);
}

如您所见,这很快就会变得非常混乱!在这种情况下,我应该遵循什么模式或做法?

【问题讨论】:

    标签: if-statement coding-style


    【解决方案1】:

    通过使用Guard Clauses先生

    string userid = Reuest.QueryString["userid"];
    
    if(userid==null)
     return denyAccess(INVALID_PARAMETER);
    
    user = new user(userid);
    if(user==null)
     return denyAccess(INVALID_USER);
    
    if (!user.hasAccess)
     return denyAccess(INVALID_ACCESS);
    
    //do stuff
    

    PS。使用返回或抛出错误

    【讨论】:

    • 不会到达那个案例,因为它上面有一个 user==null 案例,先生
    • user == null 的情况已经检查过了。语句的编写顺序很重要。您必须首先检查对象是否为空,然后检查非法值等。
    【解决方案2】:

    您可以通过否定条件来稍微清理嵌套并编写 if-else 链:

    string userid = Reuest.QueryString["userid"];
    
    if (userid == "") {
        denyAccess(INVALID_PARAMETER);
    
    } else if (null == (user = new user(userid))){
        denyAccess(INVALID_USER);
    
    } else if (!user.hasAccess){
        denyAccess(INVALID_ACCESS);
    
    } else {
        //etc.
    }
    

    【讨论】:

    • 这实际上是一种有趣的方法。我喜欢它,因为您不再需要多个返回语句。谢谢!
    【解决方案3】:

    最好拆分成多个方法(函数)。这样会很容易理解。如果一些新人阅读代码,他/她仅通过阅读方法名称本身就可以理解逻辑(注意:方法名称应该表达什么测试确实如此)。示例代码:

    string userid = Request.QueryString["userid"];
    
    if(isValidParameter(userId)){
      User user=new User(userId);
        if(isValidUser(user)&&isUserHasAccess(user)){
          //Do whatever you want
         }
    }
    
    private boolean isUserHasAccess(User user){
        if (user.hasAccess){
           return true;
        }else{
            denyAccess(INVALID_ACCESS);
           return false;
        }
    }
    
     private boolean isValidUser(User user){
        if(user !=null){
          return true;
        }else{
        denyAccess(INVALID_USER);
        return false;
        }
     }
    
    
     private boolean isValidParameter(String userId){
        if(userid !=""){
          return true;
        }else{
     denyAccess(INVALID_PARAMETER);
       return false;
      }
    }
    

    【讨论】:

    • 我认为好主意。你有一个例子说明这如何帮助结束当前方法的执行?
    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多