PHP:オブジェクト内での擬似結合メソッドの作成
-
22-07-2019 - |
質問
クエリのような条件ステートメントを処理できるオブジェクトを作成しようとしています。これは、2つの条件を「結合」して、使用されている「結合」のタイプに基づいてそれらの間に依存関係を作成できるようにするためです。現在、次のメソッドを含む単純なオブジェクトがあります。
public function addCondition ( Condition $condition, $join = null )
{
$this->conditions[] = $condition;
}
public function validate ( )
{
foreach ( $this->conditions as $condition )
{
$result = $condition->validate( );
[...]
}
}
問題は、2つのステートメント間で条件付き結合を実行できる必要があることです。これは、validateメソッドの戻り値に影響します。アイデアは、次のように条件を指定できるということです:
$this->addCondition($condition_1);
$this->addCondition($condition_2, 'AND');
$this->addCondition($condition_3, 'NOT');
これにより、3番目の条件の結果が最初の条件の結果に影響を与えるように逆方向チェーンになるように指定するために必要なロジックが生成されます。
この例では、次のように言います。
condition_1 = Apple is Red condition_2 = Apple is Ripe condition_3 = Apple is Golden Delicious
これを使用して、熟した赤くて金色のおいしいリンゴを渡すと、validate()の結果がfalseになると仮定する必要があります。 condition_3の「結合」がNOTであるため、メソッドは失敗するはずです。
ただし、現時点では、メソッド全体の結果が前の条件の結果とそれに結合される方法に依存していることをコードに伝える方法はありません。
どんな助けも大歓迎です!ありがとう。
解決
条件サブクラスにロジックを配置します。
2つ(またはそれ以上)のConditionオブジェクトを取り、両方がtrueの場合にのみtrueを返すCondition_Andクラスを作成します。
2つ(またはそれ以上)のConditionオブジェクトを取り、trueがあればfalseを返すCondition_Orクラスを作成します。
必要だと感じた場合、Condition_Notクラスを作成します(AppleはGolden Deliciousではありません)。
これらをつなぎ合わせると、探しているクエリを取得できます。それらはすべて同じタイプのサブクラスであるため、OR内にANDを挿入し、OR内にANDを挿入するなどして、それらを構築できます。
他のヒント
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;