문제

쿼리와 같은 조건부 진술을 처리 할 수있는 객체를 만들려고합니다. 이것은 두 가지 조건을 함께 '조인'하여 사용중인 '조인'유형에 따라 그들 사이의 종속성을 만들 수 있습니다. 현재 다음 방법이 포함 된 간단한 객체가 있습니다.

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

그러면 제 3 조건의 결과가 첫 번째 조건의 결과에 영향을 미치기 위해 체인을 뒤로 쇄도록 지정하는 데 필요한 논리를 생성합니다.

예에서는 다음과 같이 말합니다.

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

이것을 사용하여 나는 잘 익은 빨간색과 황금빛 맛있는 사과를 통과한다면 Validate ()의 결과는 거짓이라고 가정해야합니다. 조건 _3의 '조인'이 아니기 때문에 메소드가 실패해야합니다.

그러나 현재 전체 메소드의 결과가 이전 조건의 결과와 그에 결합 된 방식에 달려 있다고 코드를 알리는 방법이 없습니다.

모든 도움이 감사합니다! 감사.

도움이 되었습니까?

해결책

조건 서브 클래스에 논리를 넣으십시오.

두 가지 (또는 그 이상의) 조건 객체를 취하고 둘 다 참인 경우에만 True를 반환하는 Condition_and 클래스를 만듭니다.

두 개 (또는 그 이상의) 조건 객체를 사용하는 조건 _or 클래스를 만듭니다.

필요하다고 생각되면 Condition_Not 클래스를 만듭니다 (Apple은 황금 맛이 아닙니다).

이것들을 함께 묶는 것은 당신이 찾고있는 모든 쿼리를 얻을 수 있어야합니다. 그것들은 모두 동일한 유형의 서브 클래스를 모두 사용하기 때문에 OR 내부의 내부 및 내부의 내부에 내부를 넣을 수 있습니다.

다른 팁

두 가지를 포함하는 조건부 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top