Pergunta

Eu estou tentando criar um objeto que é capaz de lidar consulta semelhante a declarações condicionais. Isso é para que eu possa 'juntar' duas condições em conjunto para criar uma dependência entre eles com base no tipo de 'juntar' sendo usado. Eu tenho atualmente um simples objeto que contém os seguintes métodos:

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

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

O problema é que eu preciso ser capaz de realizar participar de uma condicional entre duas declarações, que irá afectar o valor de retorno do método a validar. A idéia é que você poderia fornecer uma condição da seguinte forma:

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

Este seria, então gerar a lógica necessária para especificar que os resultados da terceira condição seria de cadeia para trás para afetar os resultados da primeira condição.

No exemplo, vamos dizer:

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

Usando este devo supor que, se eu estava a passar uma maçã deliciosa madura, vermelha e dourada, o resultado de validate () seria falsa. O método deve falhar porque o 'juntar' para condition_3 não é.

No entanto, no momento não há nenhuma maneira de dizer o código que o resultado de todo o método depende do resultado da condição anterior ea forma como ele se junta a ele.

Qualquer ajuda é muito apreciada! Obrigado.

Foi útil?

Solução

Coloque a lógica em suas subclasses Condição.

Crie uma classe Condition_And que leva dois (ou mais) Condição objetos e retorna verdadeiro somente se forem ambas verdadeiras.

Crie uma classe Condition_Or que leva dois (ou mais) Condição objetos e retorna false se qualquer é verdadeira.

Crie uma classe Condition_Not se você sente que é necessário (a Apple não é Golden Delicious).

Amarrando estes juntos deverá fazê-lo qualquer consulta que você está procurando. Como eles são todos os subclasses do mesmo tipo, você pode construir-los colocando NOTs dentro das RUP dentro de ANDs dentro das RUP e assim por diante.

Outras dicas

Conditionals que envolvem tanto AND e OR são inerentemente aninhados. Sua classe não parece ter uma maneira de expressar isso.

Nenhum meio de nidificação de que suas condições devem ser todos unidos com AND, ou todos se juntar com OR. Em qualquer caso - você não pode usar os dois ao mesmo tempo

.

Para o seu exemplo, AND parece ser a escolha natural, então tudo que você precisa é uma bandeira NOT para cada condição:

$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

Você, então, fazer:

$valid = true;

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

return $valid;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top