Question

J'essaie de créer un objet capable de gérer des instructions conditionnelles de type requête. C'est pour que je puisse "joindre" deux conditions ensemble afin de créer une dépendance entre elles en fonction du type de "jointure" utilisé. J'ai actuellement un objet simple qui contient les méthodes suivantes:

public function addCondition ( Condition $condition, $join = null )
{
    $this->conditions[] = $condition;
}

public function validate ( )
{
    foreach ( $this->conditions as $condition )
    {
        $result = $condition->validate( );
        [...]
    }
}

Le problème est qu’il me faut pouvoir effectuer une jointure conditionnelle entre deux instructions, ce qui affectera la valeur de retour de la méthode validate. L'idée est que vous puissiez fournir une condition comme suit:

$this->addCondition($condition_1);
$this->addCondition($condition_2, 'AND');
$this->addCondition($condition_3, 'NOT');

Ceci générerait alors la logique nécessaire pour spécifier que les résultats de la troisième condition seraient enchaînés pour affecter les résultats de la première condition.

Dans l'exemple, disons:

condition_1 = Apple is Red
condition_2 = Apple is Ripe
condition_3 = Apple is Golden Delicious

En utilisant ceci, je devrais supposer que si je transmettais une pomme délicieuse mûre, rouge et dorée, le résultat de validate () serait faux. La méthode doit échouer car "rejoindre" pour la condition_3 n'est PAS.

Cependant, il n’existe actuellement aucun moyen de dire au code que le résultat de la méthode entière dépend du résultat de la condition précédente et de la manière dont elle est jointe.

Toute aide est grandement appréciée! Merci.

Était-ce utile?

La solution

Mettez la logique dans vos sous-classes de conditions.

Créez une classe Condition_And qui accepte deux objets Condition (ou plus) et renvoie true uniquement s'ils sont vrais.

Créez une classe Condition_Or qui accepte deux objets Condition (ou plus) et renvoie false si l'un d'entre eux est true.

Créez une classe Condition_Not si vous le jugez nécessaire (Apple n’est PAS Golden Delicious).

En reliant ces éléments ensemble, vous obtiendrez toutes les requêtes que vous recherchez. Étant donné que ce sont toutes des sous-classes du même type, vous pouvez les construire en plaçant des NOT à l'intérieur des OR à l'intérieur des AND à l'intérieur des OR, etc.>

Autres conseils

Les conditions qui impliquent à la fois AND et OR sont intrinsèquement imbriquées. Votre classe ne semble pas avoir le moyen de l'exprimer.

Aucune imbrication signifie que vos conditions doivent toutes être jointes avec AND ou toutes . En tout cas, vous ne pouvez pas utiliser les deux en même temps.

Pour votre exemple, AND semble être le choix naturel. Par conséquent, tout ce dont vous avez besoin est un indicateur NOT pour chaque condition:

$this->addCondition($condition_1, true);   // e.g.: must be true to succeed
$this->addCondition($condition_2, true);
$this->addCondition($condition_3, false);  // e.g.: must be false to succeed

Vous feriez alors:

$valid = true;

foreach ( $this->conditions as $condition )
{
  $valid = $valid && $condition->validate();
  if (!$valid) 
  {
    // react to "validation failed at $condition"
  }
}

return $valid;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top