我有一个包含大量方法的类。其中一些方法通过检查或验证传递给它们的参数来启动它们的块,并在必要时抛出异常。不幸的是(或幸运的是)这些验证通常是相同的,所以我需要在每个方法的开头为相同的代码块编写验证内容。例如,它看起来像这样:
<?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
}
}
我的问题:这是实现这一目标的正确方法吗?如果未捕获到异常,是否不会弄乱堆栈跟踪?或许你知道更好的解决方案。感谢。