Вопрос

Вот упрощенная версия одного метода, который у меня есть.
Все еще выглядит очень сложно
Как будет реорганизовать это безумие?

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' Считается недействительным

Есть ли способ упростить этот метод?

Это было полезно?

Решение

Прежде всего, постарайтесь не переполнять это. На мой взгляд, код недостаточно сложный, чтобы оправдать использование объектно-ориентированных шаблонов проектирования.

Как я вижу, ваш код в основном сводится к проверке ввода с различными регулярными выражениями (которые зависят от некоторых определенных пользовательских флагов. allow_num а также allow_space.

Таким образом, мое предложение - следующее (базовый рефакторинг строит часть регулярного выражения на основе конфигурации перед с использованием это выражение в любой логике проверки):

protected function isTextValid() {
    $allowedCharacters = 'A-Za-z';

    if ($this->data['allow_spaces']) {
        $allowedCharacters .= '\s';
    }
    if ($this->data['allow_num']) {
        $allowedCharacters .= '\d';
    }

    if (!preg_match("#^[{$allowedCharacters}]+\$#", $this->value)) {
        $this->messages = foo ? foor : bar;
        return false;
    }
    return true;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top