用于验证和抛出异常的相同代码

时间:2015-07-29 20:04:27

标签: php oop exception throw

我有一个包含大量方法的类。其中一些方法通过检查或验证传递给它们的参数来启动它们的块,并在必要时抛出异常。不幸的是(或幸运的是)这些验证通常是相同的,所以我需要在每个方法的开头为相同的代码块编写验证内容。例如,它看起来像这样:

<?php

class SomeClass {
    public function methodA($arg1, $arg2) {
        if (!doSomeValidation($arg1)) {
            throw new Exception('Invalid format');
        }

        // the rest of code
    }

    public function methodB($arg1) {
        if (!doSomeValidation($arg1)) {
            throw new Exception('Invalid format');
        }

        // the rest of code
    }

    public function methodC($arg1, $arg2, $arg3) {
        if (!doSomeValidation($arg1)) {
            throw new Exception('Invalid format');
        }

        if (!doAnotherValidation($arg1)) {
            throw new Exception('Not allowed');
        }

        // the rest of code
    }

}

正如您所注意到的,在此示例中,除了最后一个还有其他检查内容的方法之外,所有方法都包含用于验证内容的相同代码,但在这种情况下它根本不重要。现在,如果我想编辑这些异常的消息或更改执行验证的方式,我需要分别为每个块执行此操作,而不是一次只执行一次。更重要的是,我并不赞成编写湿代码。

我的想法是移动所有验证代码并将其包装到单独的私有方法中,因此可以在需要时从其他方法调用它:     

class SomeClass {
    private function validateA($arg) {
        if (!doSomeValidation($arg)) {
            throw new Exception('Invalid format');
        }
    }

    private function validateB($arg) {
        if (!doAnotherValidation($arg)) {
            throw new Exception('Not allowed');
        }
    }

    public function methodA($arg1, $arg2) {
        $this->validateA($arg1);

        // the rest of code
    }

    public function methodB($arg1) {
        $this->validateA($arg1);

        // the rest of code
    }

    public function methodC($arg1, $arg2, $arg3) {
        $this->validateA($arg1);
        $this->validateB($arg3);

        // the rest of code
    }

}

我的问题:这是实现这一目标的正确方法吗?如果未捕获到异常,是否不会弄乱堆栈跟踪?或许你知道更好的解决方案。感谢。

0 个答案:

没有答案