У меня есть класс с кучей методов в нем. Некоторые из этих методов начинают свои блоки с проверки или проверки переданных им аргументов и при необходимости выдают исключение. К сожалению (или к счастью) эти проверки часто одинаковы, поэтому мне нужно написать одинаковый блок кода в начале каждого метода для проверки. Например, все сводится к тому, чтобы выглядеть так:
<?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
}
}
Мой вопрос: это правильный путь для достижения этого? Не портит ли трассировка стека, если исключение не перехвачено? Или, может быть, вы знаете лучшее решение для этого. Благодарю.
Задача ещё не решена.
Других решений пока нет …