0

我正在尝试创建一个能够处理类似查询的条件语句的对象。这样我就可以将两个条件“连接”在一起,以根据所使用的“连接”类型在它们之间创建依赖关系。我目前有一个包含以下方法的简单对象:

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');

然后,这将生成指定第三个条件的结果将反向链接以影响第一个条件的结果所需的逻辑。

在示例中,让我们说:

条件_1 = 苹果是红色的
condition_2 = 苹果成熟了
condition_3 = 苹果是金冠

使用这个我应该假设如果我要传递一个成熟的、红色和金色的美味苹果,那么 validate() 的结果将是错误的。该方法应该失败,因为 condition_3 的“加入”不是。

但是,目前还没有办法告诉代码整个方法的结果取决于前一个条件的结果以及它与它的连接方式。

任何帮助是极大的赞赏!谢谢。

4

2 回答 2

1

将逻辑放在 Condition 子类中。

创建一个 Condition_And 类,该类接受两个(或更多) Condition 对象,并且仅当它们都为 true 时才返回 true。

创建一个接受两个(或更多) Condition 对象的 Condition_Or 类,如果其中任何一个为真,则返回假。

如果您认为有必要,请创建一个 Condition_Not 类(Apple 不是 Golden Delicious)。

将这些串在一起应该可以为您提供所需的任何查询。由于它们都是同一类型的子类,因此您可以构建它们,将 NOT 放在 OR 内,将 AND 放在 OR 内,以此类推。

于 2009-03-13T13:16:43.730 回答
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;
于 2009-03-13T13:16:53.510 回答