0

我有一个做某事的类,当它完成后它会返回true,但如果各种事情中的任何一个出错,它就会返回false。现在我的问题是,此类事件的状态消息应该保存在类(Example1)内还是类外(Example2),其中类可能只提供错误代码来帮助区分发生了什么。

    class Example1 {

       private $var;
       private $status;

       public function doSomething($var) {
         $this->var = $var;

         if (!is_numeric($this->var)) { 
            $this->status = 'Please provide a number'; 
            return false; 
         }

         if (empty($this->var)) {
            $this->status = 'Please fill the field';
            return false;
         }

         $this->status = 'Ok, you submitted a number, cool.';
         return true;
    } 

         function getStatus() {
            return $this->status;
         }
}

示例 2:

    class Example2 {

       private $var;

       public function doSomething($var) {
         $this->var = $var;

         if (!is_numeric($this->var)) {  
            return false; 
         }

         if (empty($this->var)) {
                return false;
         }

             return true;
    } 

}

示例 1 在我看来使用起来更方便,代码读起来像一首诗,但同时似乎不太可重用,根据您使用类的目的,您可能希望成功/错误消息具有不同的语法。

所以基本上我的问题是通常的做法是什么?

4

3 回答 3

1

这不是您要问的,但通常认为在一个函数中有多个 return 语句是不好的做法。问题是它使您更难知道您退出函数的位置,这使得不清楚执行了什么。在您的示例中,如果第一个测试成功,则不会执行其余代码。如果你之后设置一些属性会发生什么?有时它们会被设置,有时它们不会。要摆脱这个问题,最好只有一个 return 语句。将执行更多代码,您必须稍微改变编码方式才能习惯它。

这是我的意思的一个例子,你提供的代码:

public function doSomething($var) {
     $this->var = $var;
    $result = false;
     if (!is_numeric($this->var)) { 
        $this->status = 'Please provide a number';  
     }
     else if (empty($this->var)) {
        $this->status = 'Please fill the field';
     }
     else{
        $this->status = 'Ok, you submitted a number, cool.';
        $result = true;
    }
     return $result;
} 
于 2012-05-22T18:11:21.103 回答
1

第一个示例:您对错误消息进行硬编码,这是......不好的。如果您稍后不检查,您将看不到错误消息$object->status
第二个例子:如果出了问题,你知道但你不知道为什么。

我建议避免这两种方式并为更面向对象的方法抛出异常(我想这就是你想要的,因为你正在使用类:)。

于 2012-05-22T17:49:36.577 回答
1

这完全取决于你。如果错误消息更容易让您理解并帮助您调试代码,那么请务必使用它。为不同的错误提供错误代码可能只会减慢开发过程,除非您想对用户隐藏真正的错误(但在这种情况下,您有多种选择,其中之一是根本不将错误打印到屏幕上,如果用户可能会看到它们)。

于 2012-05-22T17:50:36.643 回答