【问题标题】:PHP OOP Theory - Error checking inside or outside of the class?PHP OOP 理论 - 在课堂内外检查错误?
【发布时间】:2010-09-03 14:24:51
【问题描述】:

我正在过渡到在我的所有项目中使用 OOP,从历史上看,我构建的所有东西都非常小,OOP 似乎不是一个有效的选择,但现在对于大型项目来说它是一个有效的选择。然而,最近我遇到了越来越多的“最佳实践”问题,但我找不到答案。

例如,假设我有以下内容:

class numbers{

    function __construct($number){
        $this->number = (int)$number;
    }

    function add($add){
        $this->added = $this->number + $add;
    }

    function multiply($multiply){
        $this->multiplied = $this->number * $multiply;
    }

    function minus($minus){
        $this->minused = $this->number - $minus;
    }

    function number(){
        return $this->number();
    }
}

现在假设我想申请add,然后是multiply,然后是minus。每个阶段都可能失败(我没有在示例中包含它,但想象一下它就在那里)。这就是我的问题所在,我应该这样做:

$numbers = new numbers(8);
if($numbers->add(7)){
    if($numbers->multiply(6)){
        if($numbers->minus(7){
            echo $numbers->number();
        }else{
            echo 'error minusing';
        }   
    }else{
        echo 'error multiplying number';
    }   
}else{
    echo 'error adding number';
}

或者我应该在我的构造函数中有那个部分,比如:

class numbers{

    function __construct($number){
        $this->add(6);
        $this->multiply(9);
        $this->minus(7);
        if($this->error){
            return false;
        }else{
            return true;
        }
    }

    function add($add){
        $this->added = $this->number + $add;
        if(!this->added){
            $this->error = "couldn't be added";
        }
    }

    function multiply($multiply){
        $this->multiplied = $this->number * $multiply;
        if(!this->multiplied){
            $this->error = "couldn't be multiplied";
        }
    }

    function minus($minus){
        $this->minused = $this->number - $minus;
        if(!this->minused){
            $this->error = "couldn't be minused";
        }
    }

    function number(){
        return $this->number();
    }

    function error(){
        return $this->error();
    }

}

然后简单地做:

$numbers = new numbers(5);
if($numbers){
    echo $numbers->number();
}else{
    echo $numbers->error();
}

对不起,如果这个例子是冗长的(也忽略错误,我在这里写它只是为了概述我正在尝试做的事情,这不是我正在使用的代码......)但我不知道如何在没有示例的情况下表达问题。基本上,我应该在课堂上检查错误还是应该在上课时在外面做?

【问题讨论】:

  • @FrustratedWithFormsDesigner:为什么要编辑?该方法称为“减号”——在这种情况下使用动词形式是完全可以接受的。我认为您的编辑使问题更加混乱,而不是更少。
  • @Gian:当使用方法名称作为动词时,通常最好明确说明您是在谈论方法,而不是一般的、更相似的动词。这个:“我想add,然后是multiply,然后是minus。”清楚地表明您正在谈论调用 minus 方法,而不是试图将“减号”一词误用作动词。
  • 在英语世界中,它被称为减法。减号是一个符号。
  • @Frustrated,我同意,我认为这会是一个更好的编辑。 @hopeseekr,这完全忽略了OP将方法命名为“减号”这一事实,因此术语一致性表明继续使用相同的术语(对或错)比依赖外部定义更有意义。方法名称也可以是“apple”、“pear”和“banana”,然后句子会是“I want to apple, then pear, then banana”。这是非标准用法,但在英语中肯定有优先权(另外,我也是母语人士)。

标签: php oop


【解决方案1】:

在类内部强制更新一致性几乎总是有意义的(即任何时候方法可以改变类的内部状态,检查输入)。然后使用exceptions 将其作为调用者的问题,如果该输入格式不正确,或者该操作将违反某些类不变量。

【讨论】:

  • +1 来自我。比我(现已删除)的回复更好地说明事情。我还没喝咖啡。
【解决方案2】:

在类内部进行的错误检查应该注意该类方法失败的可能性。换句话说,如果你的 numbers 类有一个 divide 方法,它应该检查以确保分母不是零。

在类的实例(类外部)上执行的错误检查应该验证是否返回了属性或类方法的正确结果。由于通常这种情况不会发生在设计良好的类中,因此您通常会检查极端情况。

但是,当您开始有一个跟踪多个事物(例如您的案例)的类时,我通常会进一步分离该类。创建用于处理数学函数的类,然后让您的数字类使用这些数学类。这样您就可以更好地分离关注点、更简洁的代码和更轻松的测试。

【讨论】:

  • 你应该支持我的回答。对于我所做的很少,我当然会检查所有可能出错的事情(除了内存不足等疯狂的事情)。
【解决方案3】:

就个人而言,我会远离您在第二个示例中的构造函数中尝试执行的操作。它对实现进行硬编码,并违反了information hiding principal。否则在不知道该类在内部做什么的情况下,当您执行 $num = new Number(8); 时,很难理解为什么要返回 47... 这也违反了 no magic number principal...

至于方法,我觉得它们很好。在这些情况下,您可能希望抛出异常或返回布尔值。您选择的因素比这里讨论的要多得多(例如您的偏好、课程的具体内容、约定等)...

哦,您的班级中有一些无限循环问题。 function number() 应该是:

function number() {
    return $this->number;
}

error() 也一样...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多