我有一些代码的示例,我经常在网站上看到我想改进的内容,并希望得到一些帮助。我常常在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);
}
正如你所看到的,这很快变得非常混乱!在这种情况下,我应该遵循任何模式或做法吗?
答案 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;
}
}