Вот упрощенная версия одного метода, который у меня есть.
Все еще выглядит очень сложно
Как будет реорганизовать это безумие?
protected function isTextValid()
{
if( $this->data['allow_num'] ){
if( $this->data['allow_space'] ){
if( preg_match( '#^[a-zA-Z0-9\s]$#', $this->val ) ){
return true;
}
else{
$this->messages = foo ? foo : bar;
return false;
}
}
else{
if( preg_match( '#^[a-zA-Z0-9]$#', $this->val ) ){
return true;
}
else{
$this->messages = foo? foor : bar;
return false;
}
}
}
else{
if( $this->data['allow_space'] ){
if( preg_match( '#^[a-zA-Z\s]$#', $this->val ) ){
return true;
}
else{
$this->messages = foo ? foor : bar;
return false;
}
}
else{
if( preg_match( '#^[a-zA-Z]$#', $this->val ) ){
return true;
}
else{
$this->messages = foo ? foo: bar;
return false;
}
}
}
}
Я стараюсь рефакторировать его, используя шаблон состояния, но безрезультатно, так как я не совсем знаком с шаблоном.
Это то, что я сделал, но быстро поработал.
interface ValidatorState{
public function isValid();
}
class AllowNumberAndSpace implement ValidatorState{
protected $context;
public function __construct(Context $context){$this->context = $context}
public function isValid(){
if( preg_match( .. ) ){
return true;
}
else{
$this->messages = foo ? foo : bar;
return false;
}
$this->context->setState(OtherState);
}
}
Class Context{
protected $state;
protected $allow_num_space_state;
public function __construct(){
$this->allow_num_space_state = new AllowNumberAndSpace($this);
$this->state = $this->allow_num_space_state;
}
public function isValid(){
return $this->state->isValid();
}
public function setState($state){$this->state = $state}
}
Очевидно, что это только тест сначала if
Ветвь, как я могу автоматически проверить другие филиалы тоже?
Я совершенно уверен, что с моим подходом что -то не так.
Есть ли способ исправить этот шаблон состояния, чтобы проверить для всех if
ответвляться?
Отредактирован
Что делает этот метод, он проверяет, $this->value
содержать ожидаемое значение на основе атрибута конфигурации, хранящегося в $this->data
Пример $this->data = array('allow_num'=>true)
, если $this->value='a1'
это рассмотреть действительный пример $this->data = array('allow_num'=>false)
, если $this->value='a1'
Считается недействительным
Есть ли способ упростить этот метод?