Является ли if with continue хорошим шаблоном для предотвращения чрезмерного вложения при переборе свойств Javascript? - PullRequest
5 голосов
/ 22 сентября 2010

Обычно я использую этот шаблон для перебора свойств объекта:

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

Мне не нравится этот чрезмерный отступ, и недавно мне сказали, что я могу избавиться от него, выполнив это:

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

   ...
}

Мне нравится это, потому что это не вводит дополнительный уровень отступа.С этим шаблоном все в порядке или есть лучшие способы?

Ответы [ 4 ]

4 голосов
/ 22 сентября 2010

Я лично предпочитаю:

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;
   }
}
2 голосов
/ 22 сентября 2010

Синтаксически я бы предпочел что-то вроде этого

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
}

Выглядит хорошо, но это влечет за собой два цикла на одном и том же объекте, а не с точки зрения производительности.

Другой способ сделать этоis functionaly

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, но вы можете явно передать это значение в качестве необязательного третьего аргумента.

Просто некоторые альтернативы.То, как вы это делаете, и то, как Дэниел объясняет, просто прекрасно и без ущерба для производительности.

Кроме того, я хотел бы отметить, что у вас нет для отступа кода для каждой фигурной скобки ...

1 голос
/ 22 сентября 2010

Один фактор зависит от того, слушаете ли вы Дугласа Крокфорда.В своей книге «JavaScript: хорошие части» он смешивает continue с плохими частями.

«Я никогда не видел фрагмент кода, который не был улучшен путем рефакторингаудалите оператор продолжения. "- Дуглас Крокфорд, JavaScript: Хорошие части

Как упомянуто в своем комментарии Тим Даун , Крокфорд не дает в книге никаких оснований объяснять, почему следует избегать continue.Но на своем веб-сайте он говорит: «Это имеет тенденцию затенять поток управления функцией».Я лишь упоминаю мнение Крокфорда, поскольку многие считают его авторитетом.

Лично я не вижу никаких проблем с тем, как вы закодировали свой цикл, тем более, что continue появляется в самом верху, где он выиграл 'легко упускать из виду.Вы работаете с командой разработчиков?У них есть хорошее понимание того, что делает continue?Есть ли у вас документ кодового соглашения, в котором говорится о том, как обрабатывать глубокое вложение операторов?

0 голосов
/ 27 октября 2010

Макконнел:

Цикл с множеством разрывов может указывать на неясное представление о структуре цикла или его роли в окружающем коде.Чрезмерное повышение разрывов часто указывает на то, что цикл может быть более четко выражен в виде серии циклов.Использование разрыва исключает возможность рассматривать петлю как черный ящик.Контролируйте условие выхода цикла с помощью одного оператора, чтобы упростить ваши циклы.'break' заставляет человека, читающего ваш код, заглянуть внутрь, чтобы понять управление цикла, что делает цикл более трудным для понимания.

Dijkstra:

такие функции, как break тенденциючтобы саботировать преимущества структурного программирования и не допустить, чтобы программист понимал программу как состав независимых единиц

Циклы с продолжением могут быть учтены в этой форме, и, таким образом, цикл может рассматриваться как черныйкоробка.Кроуфорд не прав.Перерывы пахнут, но продолжать это хорошо.

дальнейший анализ: http://sites.google.com/site/dustingetz/dev/break-and-continue

...