如何为可读性整理过多的if语句

时间:2009-10-30 11:22:09

标签: if-statement coding-style

我有一些代码的示例,我经常在网站上看到我想改进的内容,并希望得到一些帮助。我常常在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);
}

正如你所看到的,这很快变得非常混乱!在这种情况下,我应该遵循任何模式或做法吗?

3 个答案:

答案 0 :(得分:20)

使用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。使用return或抛出错误

答案 1 :(得分:3)

您可以通过否定条件来清理嵌套并编写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.
}

答案 2 :(得分:1)

最好将它拆分成多个方法(函数)。这将很容易理解。如果一些新人读取代码,他/她只需通过读取方法名称就能理解逻辑(注意:方法名称应表示什么是测试它确实)。示例代码:

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