题
我有一些代码,我在,我想提高,并希望一些帮助网站经常看到的例子。经常我看到5-10嵌套在其中的目标是消除无效的用户输入一个Page_Load方法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);
}
正如你所看到的,这得到相当混乱很快!有没有我应该在这种情况下以下的任何模式或做法?
解决方案
通过使用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。使用要么返回或抛出异常
其他提示
可以通过否定条件清理嵌套一个位和写的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.
}
更好地通过阅读方法名本身(注意它拆分成多个方法(函数)。它会很容易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;
}
}
不隶属于 StackOverflow