Question

Voici la version simplifiée d'une méthode que j'ai.
Toujours très complexe
Comment refactoriser cette folie?

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

J'essaie de le refacter en utilisant le modèle d'état mais en vain car je ne suis pas très familier avec le modèle.
C'est ce que j'ai fait mais l'abondance rapidement.

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

De toute évidence, cela ne testait que if Branche, comment puis-je également vérifier automatiquement une autre branche?
Je suis sûr qu'il y a quelque chose qui ne va pas avec mon approche.
Existe-t-il un moyen de corriger ce modèle d'état pour tester pour tous if bifurquer?

Édité
Ce que fait cette méthode, c'est de vérifier si $this->value contenir une valeur attendue basée sur l'attribut de configuration stocké dans $this->data

Exemple $this->data = array('allow_num'=>true), si $this->value='a1' c'est considérer comme un exemple valide $this->data = array('allow_num'=>false), si $this->value='a1' il est considéré comme invalide

Existe-t-il un moyen de simplifier cette méthode?

Était-ce utile?

La solution

Tout d'abord, essayez de ne pas compliquer trop. À mon avis, le code n'est pas assez complexe pour justifier l'utilisation de modèles de conception orientés objet.

Comme je le vois, votre code se résume essentiellement à valider une entrée avec différentes expressions régulières (qui dépendent de certains drapeaux spécifiés par l'utilisateur comme allow_num et allow_space.

Ma suggestion est donc la suivante (le refactorisation de base consiste à construire une partie de l'expression régulière en fonction de la configuration avant utilisant Cette expression dans n'importe quelle logique de validation):

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top