我有一个我经常在网站上看到的代码的例子,我想要改进,并希望得到一些帮助。我经常在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);
}正如你所看到的,这很快就会变得相当混乱!在这种情况下,是否有我应该遵循的模式或实践?
发布于 2009-10-30 19:31:07
通过使用Guard Clauses sir
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 stuffPS。使用return或抛出错误
发布于 2009-10-30 19:34:03
您可以通过否定条件并编写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.
}发布于 2009-10-30 19:52:46
最好将其拆分成多个方法(函数) .It将很容易understand.If一些新人通过阅读方法名本身就能理解代码的逻辑(注意:方法名应该表示它所做的测试).Sample代码:
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;
}
}https://stackoverflow.com/questions/1649248
复制相似问题