PHP: создание метода psuedo-join внутри объекта - PullRequest
0 голосов
/ 13 марта 2009

Я пытаюсь создать объект, способный обрабатывать условные операторы, подобные запросам. Поэтому я могу «соединить» два условия вместе, чтобы создать зависимость между ними в зависимости от типа используемого «соединения». В настоящее время у меня есть простой объект, который содержит следующие методы:

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

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

Проблема в том, что мне нужно иметь возможность выполнить условное соединение между двумя операторами, что повлияет на возвращаемое значение метода validate. Идея состоит в том, что вы могли бы поставить условие следующим образом:

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

Затем будет сгенерирована логика, необходимая для указания того, что результаты третьего условия будут обратным звеном, чтобы влиять на результаты первого условия.

В этом примере скажем:

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

Используя это, я должен предположить, что если бы я пропустил спелое, красное и золотистое вкусное яблоко, результат validate () был бы ложным. Метод должен завершиться сбоем, потому что «join» для condition_3 - это НЕ.

Однако в настоящее время нет способа сообщить коду, что результат всего метода зависит от результата предыдущего условия и способа его соединения с ним.

Любая помощь очень ценится! Спасибо.

Ответы [ 2 ]

1 голос
/ 13 марта 2009

Поместите логику в ваши подклассы Условие.

Создайте класс Condition_And, который принимает два (или более) объекта Condition и возвращает true, только если они оба имеют значение true.

Создайте класс Condition_Or, который принимает два (или более) объекта Condition и возвращает false, если любой равен true.

Создайте класс Condition_Not, если считаете, что это необходимо (Apple НЕ Golden Delicious).

Соединяя их вместе, вы получите любой запрос, который вы ищете. Поскольку все они являются подклассами одного типа, вы можете создать их, поместив НЕ внутри ИЛИ внутри И внутри ИЛИ и т. Д.

0 голосов
/ 13 марта 2009

Условные выражения, включающие как AND, так и OR, по своей сути являются вложенными. У вашего класса, кажется, нет способа выразить это.

Отсутствие вложенности означает, что все ваши условия должны быть либо объединены с AND, либо все должны быть объединены с OR. В любом случае - вы не можете использовать оба одновременно.

Для вашего примера AND кажется естественным выбором, поэтому все, что вам нужно, это флаг NOT для каждого условия:

$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

Вы бы тогда сделали:

$valid = true;

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

return $valid;
...