Frage

Ich versuche, ein Objekt zu erstellen, die der Umgang mit abfrage wie bedingte Anweisungen fähig ist. Dies ist, so kann ich ‚nachziehen‘ zusammen zwei Bedingungen eine Abhängigkeit zwischen ihnen zu schaffen, basierend auf der Art von ‚nachziehen‘ verwendet wird. Im Moment habe ich ein einfaches Objekt, das die folgenden Methoden enthält:

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

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

Das Problem ist, ich brauche ein bedingte Verbindung zwischen zwei Anweisungen ausführen zu können, dass der Rückgabewert der der Validate-Methode beeinflussen. Die Idee ist, dass Sie eine Bedingung liefern könnten wie folgt:

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

Dies würde dann die Logik erzeugt erforderlich, um festzulegen, dass die Ergebnisse der dritten Bedingung würden rückwärts Kette, die Ergebnisse der ersten Bedingung zu beeinflussen.

Im Beispiel kann sagen:

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

Mit diesem Ich sollte davon ausgehen, dass, wenn ich eine reife, rote und Apfel Golden Delicious passieren, das Ergebnis der validate () falsch wäre. Das Verfahren sollte scheitern, weil die ‚nachziehen‘ für condition_3 nicht.

Doch derzeit gibt es keine Möglichkeit, den Code zu sagen, dass das Ergebnis des gesamten Verfahrens auf dem Ergebnis des vorherigen Zustand abhängt und wie es ihm verbunden ist.

Jede Hilfe ist sehr zu schätzen! Danke.

War es hilfreich?

Lösung

Setzen Sie die Logik in Ihrem Zustand Subklassen.

Erstellen Sie eine Condition_And Klasse, die Objekte zwei (oder mehr) Zustand nimmt und gibt true zurück, nur, wenn sie beide wahr sind.

Erstellen Sie eine Condition_Or Klasse, die zwei (oder mehr) Bedingung Objekte nimmt und gibt false zurück, wenn überhaupt wahr ist.

eine Condition_Not Klasse erstellen, wenn Sie das Gefühl, es notwendig ist, (Apple ist nicht Golden Delicious).

diese Aneinanderreihung sollten Sie jede Abfrage erhalten Sie suchen. Da sie alle Subklassen von der gleichen Art sind, können Sie sie aufbauen NOTs innerhalb von OPs innerhalb von ANDs innerhalb von OPs und so weiter setzen.

Andere Tipps

Conditionals, die sowohl AND und OR betreffen, werden von Natur aus verschachtelt. Ihre Klasse scheint nicht eine Möglichkeit hat dies zum Ausdruck bringen.

Keine Verschachtelung bedeutet, dass Ihre Bedingungen müssen entweder alle mit AND verbunden werden, oder alle mit OR verbunden werden. Auf jeden Fall - man kann nicht beides gleichzeitig verwenden

.

Für Ihr Beispiel scheint AND die natürliche Wahl, also alles, was Sie brauchen, ist eine NOT Flagge für jede Bedingung ist:

$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

Sie würden dann tun:

$valid = true;

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

return $valid;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top