2009-10-30 69 views
6

我有一些我经常在网站上看到的代码示例,我想改进它,并希望得到一些帮助。通常,我会在page_load方法中看到5-10个嵌套的if语句,旨在消除无效的用户输入,但这看起来很难看,很难读取和维护。如何整理太多的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); 
} 

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

回答

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。用返还或通过否定的条件抛出一个错误

+0

惯于到达那种情况下,因为有一个用户==空的情况下,先生 – lemon 2009-10-30 11:35:00

+0

案件用户== null已被选中。报表写入的顺序非常重要。你必须从检查对象为空,然后非法值等开始。 – 2009-10-30 11:35:54

+0

我想我喜欢这种方法,感谢您的建议。 – NickGPS 2009-10-30 11:35:56

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. 
} 
+0

实际上这是一个有趣的方法。我喜欢它,因为你不需要多个返回语句。谢谢! – NickGPS 2009-10-30 11:52:31

1

最好将其拆分成多个方法(函数)。它会很容易understand.If一些新的人读他/她理解的逻辑的代码只是读取的方法名称本身(注:方法的名称应该表达它做什么测试)。样品代码:

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

我觉得好主意。你有没有一个例子说明这可能有助于结束当前方法的执行? – NickGPS 2009-10-30 13:19:55

+0

+1,这是最好的解决方案恕我直言 – rcampbell 2009-10-30 18:07:04