Domanda

Ecco la versione semplificata di un metodo che ho.
Sembrano ancora molto complessi
Come farebbe un refactor questa follia?

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

Provo a refactor usando il modello di stato, ma fino a nessun risultato poiché non ho del tutto con il modello.
Questo è quello che ho fatto, ma l'abbondi velocemente.

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

Ovviamente questo solo test prima if Branch, come posso controllare automaticamente anche altri rami?
Sono abbastanza sicuro che ci sia qualcosa di sbagliato nel mio approccio.
C'è un modo per correggere questo modello di stato per testare tutti if ramo?

Modificato
Quello che fa questo metodo è, controlla se $this->value contenere un valore atteso in base all'attributo di configurazione memorizzato in $this->data

Esempio $this->data = array('allow_num'=>true), Se $this->value='a1' è considerato un esempio valido $this->data = array('allow_num'=>false), Se $this->value='a1' è considerato non valido

C'è un modo per semplificare questo metodo?

È stato utile?

Soluzione

Prima di tutto, cerca di non completarlo in modo eccessivo. A mio avviso, il codice non è abbastanza complesso da giustificare l'uso di modelli di progettazione orientati agli oggetti.

A quanto pare allow_num e allow_space.

Quindi il mio suggerimento è il seguente (il refactoring di base sta costruendo parte dell'espressione regolare in base alla configurazione prima usando Questa espressione in qualsiasi logica di convalida):

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top