如何简化此代码?(如果其他语句太多)


How to simplify this code? (too many if else statment)

这里有一个用于用户输入信息的简单代码,第一个if的条件是这个->消毒,检查数据是否有效,另一个是this->haveDuplicateUser_nameAndEmail((,用于检查数据库中是否存在用户名和电子邮件。第三个是this->addNewUser((,它将用户记录添加到数据库中。

    if(!$this->sanitize()){
        $this->printError();   //the data is not sanitize
        return;
    }else{       
        if($this->haveDuplicateUser_nameAndEmail()){ //duplicateUserNameAndPassword, cannot add new user
            $this->printError();
        }else{
            if($this->addNewUser()){ 
                $this->printSuccess(); //add user success
            }else{
                $this->printError(); //add user fail
            }
        }
    }        

伪代码:

  if not this->sanitize() or
     this->haveDuplicateUser_nameAndEmail() or
     not this->addNewUser() then
     this.printError()
  else then
     this.printSuccess()

注意:这是假设短路行为或功能不会在以前的条件不满足的情况下发生严重故障。

您可以使用异常来简化您向我们展示的块。您必须更新相应方法的代码,才能根据它们自己的内部布尔逻辑抛出这些异常。在php中,没有非if解决方案可以说出类似"这个POST等于一个空字符串吗?"之类的话。

如果你这样做,你就进入了使用异常作为goto的领域,这通常是不受欢迎的。我认为你可以用任何一种方式进行辩论。

try {
   $this->sanitize();
   $this->haveDuplicateUser_nameAndEmail();
   $this->addNewUser();
   $this->printSuccess();
}
catch (SanitizeOrDuplicateException $sode) {
   $this->printError();
}

假设第一个"return"是无关的,那么:

if ((!$this->sanitize()) 
     || ($this->haveDuplicateUser_nameAndEmail())
     || (!$this->addNewUser()) {
   $this->printError();   //the data is not sanitize
}
else
  $this->printSuccess(); //add user success

或者您可能想返回任何错误?如果是,只需添加"return"即可。

但你的第一个片段并没有什么真正的"错误"。如果它正确地涵盖了所有条件,那么就去做:(

整个过程相当于:

    if(!$this->sanitize()){
        $this->printError();   //the data is not sanitize
        return;
    } else if($this->haveDuplicateUser_nameAndEmail()){       
        $this->printError();
    } else if($this->addNewUser()) {
        $this->printSuccess(); //add user success
    } else {
         $this->printError(); //add user fail
    }

我认为这是javascript,并且支持else-if。

$is_valid = $this->sanitize() && !$this->haveDuplicateUser_nameAndEmail();
if($is_valid && $this->addNewUser()){
    $this->printSuccess();
}else{
    $this->printError();
}

您也可以在不使用$is_valid变量的情况下完成此操作,但我认为,如果以后需要返回并维护它,它有助于提高代码的可读性。