سؤال

أنا أعمل على مشروع يتطلب معالجة جافا سكريبت معقدة للغاية.وهذا يشمل الكثير من المتداخلة if-elseفي عدد لا بأس به من الأماكن.لقد اهتمت بشكل عام بتحسين كود JavaScript قدر الإمكان من خلال قراءة النصائح الأخرى حول Stack Overflow، ولكنني أتساءل عما إذا كانت الإنشاءتان التاليتان ستحدثان أي فرق من حيث السرعة وحدها:

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

ضد

if(some_condition) {
    // Process
}

else {
   // The 'else' condition...
}
هل كانت مفيدة؟

المحلول

وأنا دائما أذهب مع الأسلوب الأول. أسهل للقراءة، وأقل المسافة البادئة. بقدر سرعة التنفيذ، وهذا سيعتمد على التنفيذ، ولكن أتوقع لهم على حد سواء أن تكون متطابقة.

نصائح أخرى

في العديد من اللغات، تعتبر هذه ممارسة شائعة عكس if تصريحات للحد من التداخل او استعمل الشروط المسبقة.

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

"الملف الشخصي، لا تتكهن!"

  1. أنت تضع العربة أمام الحصان (قابلية الصيانة من قبل البشر تتفوق على سرعة الآلة)
  2. يجب عليك قيادة جهود التحسين الخاصة بك من خلال قياسات, مما يعني

    • يجب أن تحدد وقت التنفيذ بنفسك؛من الواضح أنها ستختلف باختلاف المتصفحات والإصدارات
    • يجب عليك فقط تحسين سرعة نقاط الجذب من طلبك (انظر النقطة 1)

ولن يكون هناك أي فرق في الأداء أوصي المثال الثاني عن الصيانة. بشكل عام فإنه من الممارسات الجيدة أن يكون واحدا واحدا فقط نقطة الخروج الممكنة للروتين. كما أنه يساعد التصحيح والفهم.

وسوف تستخدم النهج الأول عندما استبعاد الحالات غير صالحة.

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

وإليك مثال جافا.

  public void debitAccount(Account account, BigDecimal amount) {
    if(account.user == getCurrentUser()) {
      if(account.balance > amount) {
           account.balance = account.balance - amount
       } else {
          //return or throw exception
       }
    } else {
        //return or throw exception
    }
  }

وVS

 public void debitAccount(Account account, BigDecimal amount) {
    if(account.user != getCurrentUser()) return //or error
    if(account.balance < amount) return //or error
    account.balance = account.balance - amount    
}

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

وكملاحظة جانبية، وأنا أعتقد أن هذا هو الأمثل الصغير لا لزوم لها، وربما يجب عليك البحث في أماكن أخرى لتحسين الأداء، أي محة عن البرنامج النصي من خلال أدوات مطوري Chrome أو الحرائق لفايرفوكس (أو أدوات مماثلة) وابحث عن بطء / طويلة التوالي يدعو / وظائف.

ولئن كان يعتمد على تنفيذ جافا سكريبت للمتصفح على التوالي، لا ينبغي أن يكون هناك أي فرق ملحوظ بينهما (من حيث السرعة).

والنموذج الثاني هو الأفضل منذ كسر تدفق ليس عادة البرمجة الجيدة. أعتقد أيضا عن ذلك في التجمع، وتعليمة قفزة (العملية الدقيقة) هو دائما تقييم بغض النظر عن التقييم.

اختبر ذلك بنفسك. إذا كان يتم تشغيل هذا جافا سكريبت في المتصفح، وسوف تعتمد بشكل شبه مؤكد الجافا سكريبت تحليل محرك المتصفح.

وما أفهمه هو أنه لن تحدث فرقا لأنك فرع مع إذا كان الشرط. لذا، إذا some_condition غير صحيح، لن يكون لمست جزء آخر، حتى من دون العودة.

لنفترض أن return يأخذ 1MS مقابل if متداخلة مع الأخذ 0.1ms (أو العكس بالعكس).

ومن الصعب أن نتصور أي واحد يجري تقريبا أن بطيئة.

والآن، هل فعل ذلك أكثر من 100 مرة في الثانية الواحدة؟

وإذا كان الأمر كذلك، <م> ربما يجب عليك الرعاية.

الحديث من تجربتي يعتمد على الحالة التي تتحقق منها.

  1. if .. return جيد وسهل القراءة إذا قمت بفحص بعض الشروط المنطقية (ربما الإعداد) التي من شأنها أن تجعل التعليمات البرمجية التالية بالكامل غير ضرورية ليتم تنفيذها على الإطلاق.

  2. if .. else من الأسهل قراءتها إذا كنت تتوقع أن تكون بعض القيمة إحدى القيمتين المحتملتين (أو أكثر) وتريد تنفيذ تعليمات برمجية مختلفة في كلتا الحالتين.بمعنى أن القيمتين المحتملتين تمثلان شروطًا متساوية القيمة القابلة للتفسير، وبالتالي يجب كتابتهما على نفس المستوى المنطقي.

في رأيي، وعودة وآخر هو نفسه بالنسبة للحالة المذكورة أعلاه ولكن في if-else عام وif()return; مختلفة جدا. يمكنك استخدام عبارة الإرجاع عندما تريد الانتقال من النطاق الحالي لنطاق الأم بينما في حالة من if-else يمكنك التحقق من وجود أكثر إذا-آخر في نفس النطاق.

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