0

クエリのような条件ステートメントを処理できるオブジェクトを作成しようとしています。これは、使用されている「結合」のタイプに基づいて、2 つの条件を「結合」して、それらの間に依存関係を作成できるようにするためです。現在、次のメソッドを含む単純なオブジェクトがあります。

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

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

問題は、validate メソッドの戻り値に影響を与える 2 つのステートメント間で条件付き結合を実行できるようにする必要があることです。アイデアは、次のように条件を指定できるということです。

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

これにより、3 番目の条件の結果が最初の条件の結果に影響を与えるように後方連鎖することを指定するために必要なロジックが生成されます。

例では、次のように言いましょう。

condition_1 = リンゴは赤
condition_2 = リンゴは熟しています
condition_3 = りんごはゴールデンデリシャス

これを使用して、熟した赤く金色のおいしいリンゴを渡すと、validate() の結果が false になると仮定する必要があります。condition_3 の「結合」が NOT であるため、メソッドは失敗するはずです。

ただし、現時点では、メソッド全体の結果が前の条件の結果と結合方法に依存することをコードに伝える方法はありません。

どんな助けでも大歓迎です!ありがとう。

4

2 に答える 2

1

ロジックを Condition サブクラスに入れます。

2 つ (またはそれ以上) の Condition オブジェクトを受け取り、両方とも true の場合にのみ true を返す Condition_And クラスを作成します。

2 つ (またはそれ以上) の Condition オブジェクトを取り、いずれかが true の場合に false を返す Condition_Or クラスを作成します。

必要に応じて Condition_Not クラスを作成します (Apple は Golden Delicious ではありません)。

これらをつなぎ合わせると、探しているクエリが得られます。それらはすべて同じタイプのサブクラスであるため、OR の内側に AND を入れ、OR の内側に NOT を入れて構築することができます。

于 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 に答える