Domanda

Sto cercando di creare un oggetto in grado di gestire istruzioni condizionali simili a query. In questo modo posso "unire" due condizioni insieme per creare una dipendenza tra loro in base al tipo di "join" utilizzato. Al momento ho un oggetto semplice che contiene i seguenti metodi:

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

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

Il problema è che devo essere in grado di eseguire un join condizionale tra due istruzioni, che influirà sul valore di ritorno del metodo validate. L'idea è che potresti fornire una condizione come segue:

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

Ciò genererebbe quindi la logica richiesta per specificare che i risultati della terza condizione verrebbero a catena all'indietro per influenzare i risultati della prima condizione.

Nell'esempio, diciamo:

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

Usando questo dovrei supporre che se dovessi passare una mela deliziosa matura, rossa e dorata, il risultato di validate () sarebbe falso. Il metodo dovrebbe fallire perché il 'join' per condition_3 NON è.

Tuttavia, al momento non è possibile dire al codice che il risultato dell'intero metodo dipende dal risultato della condizione precedente e dal modo in cui è unito ad esso.

Qualsiasi aiuto è molto apprezzato! Grazie.

È stato utile?

Soluzione

Inserisci la logica nelle sottoclassi delle tue condizioni.

Crea una classe Condition_And che accetta due (o più) oggetti Condition e restituisce true solo se sono entrambi true.

Crea una classe Condition_Or che accetta due (o più) oggetti Condition e restituisce false se ne esiste una vera.

Crea una classe Condition_Not se ritieni che sia necessaria (Apple NON è Golden Delicious).

La creazione di stringhe insieme dovrebbe farti ottenere qualsiasi query tu stia cercando. Poiché sono tutte sottoclassi dello stesso tipo, è possibile crearle inserendo NOT all'interno di OR all'interno di AND all'interno di OR e così via.

Altri suggerimenti

I condizionali che coinvolgono sia AND che OR sono intrinsecamente nidificati. La tua classe non sembra avere modo di esprimerlo.

Nessun annidamento significa che le tue condizioni devono essere unite a AND , oppure a tutte le OR . In ogni caso, non è possibile utilizzare entrambi contemporaneamente.

Nel tuo esempio, AND sembra la scelta naturale, quindi tutto ciò di cui hai bisogno è un flag NOT per ogni condizione:

$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

Dovresti quindi fare:

$valid = true;

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

return $valid;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top