2009-03-13 4 views
0

Я пытаюсь создать объект, который способен обрабатывать запросные заявления. Это значит, что я могу «объединить» два условия вместе, чтобы создать зависимость между ними на основе используемого типа «join». Я в настоящее время есть простой объект, содержащий следующие методы:PHP: Создание метода psuedo-join внутри объекта

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

public function validate () 
{ 
    foreach ($this->conditions as $condition) 
    { 
     $result = $condition->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 НЕ.

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

Любая помощь очень ценится! Благодарю.

ответ

1

Положите логику в подклассы состояния.

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

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

Создать класс Condition_Not, если вы считаете, что это необходимо (Apple не является Golden Delicious).

Скручивая эти вместе, вы получите любой запрос, который вы ищете. Поскольку они все подклассы одного типа, вы можете создать их, помещая NOT внутри ORs внутри ANDs внутри ORs и так далее.

0

Условные обозначения, которые включают как 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; 
Смежные вопросы