【问题标题】:How to simplify this code? (too many if else statment)如何简化这段代码? (if else 语句太多)
【发布时间】:2011-08-02 04:33:43
【问题描述】:

这里是用户输入信息的简单代码,第一个if的条件是 this->sanitize,检查数据是否有效,另一个是 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
            }
        }
    }        

【问题讨论】:

    标签: php logic


    【解决方案1】:

    伪代码:

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

    注意:这假定如果不满足先前的条件,短路行为或功能不会发生史诗般的失败。

    【讨论】:

      【解决方案2】:

      您可以使用例外来简化您提供给我们的块。您必须更新各个方法的代码,以根据它们自己的内部布尔逻辑抛出这些异常。没有非if 解决方案可以说“此 POST 是否等于空字符串?”在php中。

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

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

      【讨论】:

      • 我喜欢例外的方式。太好了!
      【解决方案3】:

      假设第一个“返回”是无关的,那么:

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

      或者您想返回任何错误?如果是这样,只需添加“return”即可。

      但是您的第一个 sn-p 并没有什么真正“错误”。如果它正确地涵盖了所有条件 - 那就去吧:)

      【讨论】:

      • +1。好的答案......基本上和我的一样,但实际上是 PHP 语法。哈!
      【解决方案4】:

      整个事情相当于:

          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 ifs。

      【讨论】:

        【解决方案5】:
        $is_valid = $this->sanitize() && !$this->haveDuplicateUser_nameAndEmail();
        if($is_valid && $this->addNewUser()){
            $this->printSuccess();
        }else{
            $this->printError();
        }
        

        您也可以不使用$is_valid 变量来完成它,但我认为如果您以后需要返回并维护它,它有助于代码的可读性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-14
          • 2020-11-23
          • 2022-01-22
          相关资源
          最近更新 更多