Как привести в порядок слишком много операторов if для удобства чтения - PullRequest
6 голосов
/ 30 октября 2009

У меня есть пример кода, который я часто вижу на веб-сайтах, который я хотел бы улучшить и был бы признателен за помощь. Часто я вижу 5-10 вложенных операторов if в методе page_load, которые нацелены на устранение недопустимого пользовательского ввода, но это выглядит уродливо, и его трудно читать и поддерживать.

Как бы вы порекомендовали очистить следующий пример кода? Главное, что я пытаюсь устранить - это вложенные операторы 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 ]

20 голосов
/ 30 октября 2009

Используя 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. используйте либо возврат, либо сбросьте ошибку

3 голосов
/ 30 октября 2009

Вы можете немного очистить вложенность, отменив условия и записав цепочку 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.
}
1 голос
/ 30 октября 2009

Лучше разбить его на несколько методов (функций). Это будет легко понять. Если какой-то новый человек читает код, он / она понимает логику, просто прочитав само имя метода (Примечание: имя метода должно выражать, какой тест это делает). Пример кода:

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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...