هل إذا استمرت مع نمط جيد لمنع التعشيش المفرط أثناء التكرار على الخصائص في JavaScript؟

StackOverflow https://stackoverflow.com/questions/3765723

سؤال

عادةً ما أستخدم هذا النمط لتكرار خصائص الكائن:

for(var property in object) {
   if(object.hasOwnProperty(property)) {
      ...
   }
}

لا أحب هذا المسافة البادئة المفرطة ومؤخراً تمت الإشارة إليّ أنه يمكنني التخلص منه من خلال القيام بذلك:

for(var property in object) {
   if(!object.hasOwnProperty(property)) {
      continue;
   }

   ...
}

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

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

المحلول

أنا شخصيا أفضل:

for(var property in object) if(object.hasOwnProperty(property)) {
     ...
}

لا يوجد مستوى إضافي من المسافة البادئة بسبب for, if, ، وما إلى ذلك ، ستأخذ البيان التالي إذا تركت أقواس مجعد. منذ أن وضعنا كل الكود لدينا داخل if hasOwnProperty حظره يجعل أي أقواس for بيان غير ضروري.

في الأساس يعادل:

for(var property in object) {
   if(object.hasOwnProperty(property)) {
     ...
   } else {
      continue;
   }
}

نصائح أخرى

بصراحة كنت أفضل شيء من هذا القبيل

function own(obj) {
  var ownprops = {};
  for (var prop in obj) 
    if (obj.hasOwnProperty(prop)) ownprops[prop] = 1;

  return ownprops;
}

for (var property in own(object)) {
 //code
}

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

الطريقة الأخرى للقيام بذلك هي وظيفة

function foreach(obj, func, thisp) {
  for (var prop in obj)
    if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop);
}

foreach(object, function(val, key) {
  //code
});

حلقة واحدة فقط ، ولكن يتم استدعاء وظيفة لكل تكرار ، وهو ليس أداءً رائعًا ولكنه أفضل من الحل الأخير. لاحظ أنه يتجول أيضًا في قيمة this, ، ولكن يمكنك تمرير هذه القيمة بشكل صريح باعتبارها الوسيطة الثالثة الاختيارية.

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

أيضا ، أود أن أشير إلى أنك لا تفعل ذلك لديك لدخول الكود الخاص بك لكل دعامة مجعد ...

يعتمد أحد العوامل على ما إذا كنت تستمع إلى دوغلاس كروكفورد. في كتابه ، JavaScript: الأجزاء الجيدة ، يتكتل continue في مع سيئ القطع.

"لم أر قط قطعة رمز لم يتم تحسينها عن طريق إعادة تمثيله لإزالة بيان متابعة." - دوغلاس كروكفورد ، جافا سكريبت: الأجزاء الجيدة

كما تيم داون المذكورة في تعليقه ، لا يعطي كروكفورد أي سبب في الكتاب لشرح السبب continue يجب اجتنابها. لكن على موقعه على الويب يقول: "يميل إلى حجب تدفق التحكم في الوظيفة." أذكر فقط رأي كروكفورد لأن الكثيرين يعتبرونه سلطة.

أنا شخصياً لا أرى أي مشكلة في كيفية ترميز حلقتك ، خاصة وأن continue يظهر مباشرة في الجزء العلوي حيث لن يتم تجاهله بسهولة. هل تعمل مع فريق من المطورين؟ هل لديهم فهم جيد لما continue يفعل؟ هل لديك وثيقة اتفاقيات رمز تتحدث عن كيفية التعامل مع التعشيش العميق للبيانات؟

ماكونيل:

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

ديجكسترا:

تميل ميزات مثل Break إلى تخريب فوائد البرمجة المنظمة ، ومنع المبرمج من فهم البرنامج كتكوين للوحدات المستقلة

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

مزيد من التحليل: http://sites.google.com/site/dustingetz/dev/break-and-continue

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