سؤال

آسف إذا كان هذا هو سؤال شركات العلوم 101.أنا غير متأكد إذا كنت أفتقد شيئًا واضحًا.

لنفترض أن بعض إدخالات المستخدم تؤدي إلى حدوث خطأ، وأريد اكتشافه وإرجاع بعض التعليقات.سيكون الخطأ رقمًا، 0 - 8.0 يعني "لا يوجد خطأ".أريد أن أقدم للمستخدم تعليقات محددة للغاية إذا كان الخطأ هو 3 (على سبيل المثال، لا يُسمح بالأرقام).بالنسبة للاحتمالات السبعة الأخرى، أريد فقط إنهاء البرنامج النصي وتكرار الخطأ.

لقد كنت أعمل على هذا وقررت أن أذهب مع هذا:

$no_errors ($_error != 0 || $_error != 3) ? FALSE : TRUE;
if (!$no_errors)
echo $error_msg['$_error'];
$error_3 ($no_errors && $_error == 3) ? TRUE : FALSE;
if ($error_3)
   bunch of stuff happens;
else
   bunch of other stuff;

على أي حال، كنت ألاحظ بعد ذلك عامل التشغيل OR في السطر الأول وكنت أفكر أنه قد يكون من الأفضل/الأكثر أمانًا استخدام عامل التشغيل AND.ولكن كلما فكرت أكثر، كلما قل الفرق.

لذا فإن السؤال الحقيقي هو، إذا كنت تريد استبعاد احتمالين لمتغير معين، فهل يكون AND وOR متطابقين، أم أن أحدهما أكثر مثالية منطقيًا/وظيفيًا؟

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

المحلول

ومنطقيا ما يلي متطابقة (عذر رمز زائف بلدي)

(! expression_one || ! expression_two) /** this is the same as the one below **/
! (expression_one && expression_two)

وظيفيا واحد الذي هو أكثر الأمثل؟ كلاهما الأمثل مثل بعضها البعض. في كلا الاتجاهين (&& و ||) تسمح الدائرة قصيرة إذا كان التعبير الأول هو الصحيح (في || الحالة) أو خاطئة (في حالة &&)

نصائح أخرى

وسيكون أكثر قابلية للقراءة كثيرا إذا كنت تستخدم عبارة التبديل:

switch ($_error) {
    case 0;
        nothing happens;
        break;
    case 3:
        bunch of stuff happens;
        break;
    default:
        bunch of other stuff;
        break;
}

وأولا وقبل كل شيء، وأعتقد أنني سوف نوصي باستخدام وسيلة أخرى لتحديد الأخطاء من استخدام "الأرقام السحرية". أنها صعبة للحفاظ على، وكنت قد نسيت بسهولة ما "3" يعني. يبدو أن لغتك هي PHP، الذي يحظى بدعم استثناءات. أود أن أوصى استخدامها بدلا من ذلك، يمكنك قراءة المزيد عنها هنا: http://dk.php.net/ استثناءات

وأما عن العوامل المنطقية، لا توجد في الواقع أي أن تعتبر "الممارسات الجيدة". استخدام ما تريد. إذا كان لديك صعوبة في معرفة عند التعبير هو صواب / خطأ، حاول جعل جدول الحقيقة: HTTP: // en.wikipedia.org/wiki/Truth_table

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

وخلاف ذلك، فإن أداء المشغلين أنفسهم لا يختلف حقا. استخدام ما هو أكثر قابلية للقراءة لك.

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

وهذا من شأنه أن تبدو أكثر بساطة لقراءة:

  if($_error==3)
      do stuff;
    else if($_error>0)
      do some other stuff
    else
      do normal stuff

لا أحد يلاحظ في ميكروثانية التي يمكنك الفوز.

  1. أنا شخصياً سأتخلص من استخدام هذه الأرقام وأستخدم الثوابت بدلاً من ذلك.إلى جانب سهولة صيانتها، فإنها تجعل عملية الترميز نفسها أسهل بكثير وتسمح لك بتحديث القيم غدًا، على سبيل المثال.إذا أجبرتك الظروف على تغيير الرقم من 3، فيجب عليك مراجعة جميع التعليمات البرمجية الخاصة بك إلى حد كبير
  2. كما اقترح Gkrogers ، فإن التبديل أثناء إنجاز نفس الشيء أمر أسهل بكثير في القراءة والمحافظة عليه

من ناحية الأداء، أعتقد أنهما متشابهان جدًا (انظر مشاركة wvanbergen)، ولكن هناك اختلافات واضحة في السلوك.أعتقد أن منشورك الحالي قد لا يحقق ما كنت تأمل فيه.في السطر الأول، إذا كنت $_error = 3، فسيكون لديك $no_errors = false.أثناء قيامك بالتحقق من شرطين يجب استيفاءهما، ربما يكون هذا أكثر ملاءمة.

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

أجد عمومًا أنه في مثل هذا الموقف مع وجود عدد قليل من المتغيرات فقط، فإن الطريقة التي أكتب بها الجملة باللغة الإنجليزية توفر لي الطريقة الأكثر سهولة (ودقة) لتحديد العوامل المنطقية.

إذا وجدت أن الكود يبدو فوضويًا بعد هذه العملية، فقد تجد ذلك هذا الرابط على قوانين دي مورغان مفيد

و(A || B) =! (A && B). لذلك حقا لا تحدث فرقا

وتحرير: (A || B) = (A && B) غير صحيح. تكس للتعليق. الشكل الصحيح هو (! A ||! B) =! (A && B).

واعتذاري

إذا كنت تستخدم:

$no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE;

وهذا يعني انه اذا كان $ خطأ! = 0 AND $ خطأ! = 3 وهو منطق غير صحيح لأنه لا يمكن == الخطأ $ 3 و 0 يمكن أن يكون 3 أو 0 ولكن ليس على حد سواء.
في المثال أعلاه إذا $ الخطأ = 0 ثم سيكون تقييم إلى FALSE لأنه ليس 3 && 0 كنت تبحث عن أن تكون إما 3 || 0.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top