Pregunta

Estoy tratando de crear un objeto que sea capaz de manejar declaraciones condicionales similares a consultas. Esto es para que pueda 'unir' dos condiciones para crear una dependencia entre ellas en función del tipo de 'unión' que se utilice. Actualmente tengo un objeto simple que contiene los siguientes métodos:

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

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

El problema es que necesito poder realizar una unión condicional entre dos declaraciones, que afectará el valor de retorno del método de validación. La idea es que pueda proporcionar una condición de la siguiente manera:

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

Esto generaría la lógica requerida para especificar que los resultados de la tercera condición se encadenarían hacia atrás para afectar los resultados de la primera condición.

En el ejemplo, digamos:

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

Utilizando esto, debería suponer que si pasara una manzana deliciosa madura, roja y dorada, el resultado de validate () sería falso. El método debería fallar porque la 'unión' para la condición_3 NO es.

Sin embargo, actualmente no hay forma de decirle al código que el resultado de todo el método depende del resultado de la condición anterior y de la forma en que se une a él.

¡Cualquier ayuda es muy apreciada! Gracias.

¿Fue útil?

Solución

Ponga la lógica en sus subclases de condición.

Cree una clase Condition_And que tome dos (o más) objetos Condition y devuelva verdadero solo si ambos son verdaderos.

Cree una clase Condition_Or que tome dos (o más) objetos de condición y devuelva falso si alguno es verdadero.

Cree una clase Condition_Not si cree que es necesario (Apple NO es Golden Delicious).

Al unir estos elementos debería obtener cualquier consulta que esté buscando. Como todas son subclases del mismo tipo, puede construirlas colocando NOTs dentro de OR dentro de AND dentro de OR y así sucesivamente.

Otros consejos

Los

condicionales que involucran tanto AND como OR están inherentemente anidados. Su clase no parece tener una manera de expresar esto.

Sin anidamiento significa que todas sus condiciones deben estar unidas con AND , o todas deben estar unidas con OR . En cualquier caso, no puede usar ambos al mismo tiempo.

Para su ejemplo, AND parece la opción natural, por lo que todo lo que necesita es un indicador NOT para cada condición:

$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

Entonces harías:

$valid = true;

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

return $valid;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top