سؤال

وأنا أحاول لإنشاء كائن قادر على التعامل مع البيانات مشروطة مثل الاستعلام. هذا هو حتى أستطيع أن "انضمام" شرطين معا لخلق تبعية بينهما على أساس نوع "الانضمام" المستخدمة. لدي حاليا كائن بسيط الذي يحتوي على الأساليب التالية:

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

وباستخدام هذا أود أن نفترض أنه إذا كنت لتمرير التفاح لذيذ ناضجة والأحمر والذهبي، ونتيجة للتحقق من صحة () أن تكون كاذبة. يجب أن تفشل الأسلوب لأن "الانضمام" للcondition_3 هو NOT.

ولكن، في الوقت الحاضر لا توجد وسيلة لإخبار التعليمات البرمجية التي نتيجة لطريقة بأكمله يعتمد على نتيجة للحالة السابقة، والطريقة التي يتم ضمها إليها.

وهي موضع تقدير أي مساعدة! شكرا.

هل كانت مفيدة؟

المحلول

ووضع المنطق في الفئات الفرعية الشرط الخاص بك.

وإنشاء فئة Condition_And أن يأخذ اثنين (أو أكثر) الأجسام الحالة وإرجاع صحيحا إلا إذا كلاهما صحيح.

وإنشاء فئة Condition_Or أن يأخذ اثنين (أو أكثر) الأجسام الحالة وإرجاع كاذبة إن وجدت صحيح.

وإنشاء فئة Condition_Not إذا كنت تشعر أنه من الضروري (أبل ليست الذهبي لذيذ).

يجب التوتير هذه معا تحصل على أي استفسار كنت تبحث عنه. منذ انهم جميعا فرعية من نفس النوع، يمكنك بناء عنها وضع الفقراء داخل نسب الأرجحية داخل يستخدم المعامل داخل نسب الأرجحية وهلم جرا.

نصائح أخرى

والشرطية التي تنطوي على حد سواء 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