Pergunta

Aqui está a versão simplificada de um método que eu tenho.
Ainda parece muito complexo
Como alguém refatoraria essa insanidade?

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;
            }
        }
    }
}

Eu tento refatorá -lo usando o padrão de estado, mas sem sucesso, pois não estou familiarizado com o padrão.
Foi isso que eu fiz, mas rapidamente a abondá.

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}
}

Obviamente, este apenas teste primeiro if Filial, como posso verificar automaticamente outra filial também?
Tenho certeza de que há algo errado com minha abordagem.
Existe uma maneira de corrigir esse padrão de estado para testar para todos if ramo?

Editado
O que esse método faz é ver se verifique se $this->value contém valor esperado com base no atributo de configuração armazenado em $this->data

Exemplo $this->data = array('allow_num'=>true), E se $this->value='a1' é considerado um exemplo válido $this->data = array('allow_num'=>false), E se $this->value='a1' é considerado inválido

Existe uma maneira de simplificar esse método?

Foi útil?

Solução

Primeiro de tudo, tente não complicar demais isso. Na minha opinião, o código não é complexo o suficiente para justificar o uso de padrões de design orientados a objetos.

Eu o vejo, seu código se resume basicamente a validar uma entrada com diferentes expressões regulares (que dependem de algumas bandeiras especificadas pelo usuário como allow_num e allow_space.

Portanto, minha sugestão é o seguinte (a refatoração básica está construindo parte da expressão regular com base na configuração antes usando Esta expressão em qualquer lógica de validação):

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top