Проверки перед присваиванием
Одним из распространённых приёмов программирования является проверка на отсутствие в переменной некоторого значения перед присваиванием ей этого значения.
Иногда возникают ситуации, когда можно просто переприсвоить ей это значение, не проверяя есть ли оно там или нет (заведомо знаем, что есть). Конечно, возникает мысль, что повторно выполняется присваивание переменной того же значения, которое в ней уже хранится, но эта мысль компенсируется тем, что если этого не делать, то придётся выполнять операцию проверки. Разница в производительность этих двух операций не велика, так зачем тогда делать то, чего можно не делать. Хотелось бы узнать, что это: просто стиль программирования или за этим стоят какие-нибудь другие объективные причины?? |
пример кода. На мой взгляд javascript в этом отношении вообще супер, в нем можно использовать логические операторы для присваивания значений.
|
Цитата:
Цитата:
Цитата:
|
function test (options) { options = options || {}; return options.test; } |
Цитата:
|
Цитата:
Например, я мог бы сделать так, каждый раз устанавливая заново значения style.background, вместо того, чтобы работать с запоминанием того элемента, который был нажат. <div style="cursor: pointer" onclick=" var span = this.getElementsByTagName('span'); var dl = span.length; var target = event.srcElement || event.target; for (var i = 0; i < dl; i++) { if (target == span[i]) span[i].style.background = 'green'; else span[i].style.background = 'yellow'; } "> <span>1</span> <span>2</span> <span>3</span> </div> |
Цитата:
|
Цитата:
оно? do { var i; if(i){ i += 1; } else { i = 0; } } while(1); |
Цитата:
Я хочу делать так как в этом примере, то есть переприсваивать значения переменным без проверки существуют они там уже или нет, и не ловить по этому поводу себя на мысли "а не пишу ли я говнокод", вот я и выясняю, говнокод это или нет. |
У меня тоже возникал такой вопрос. Что лучше?
Это a = a||7 или это a||(a=7) |
Цитата:
а так ... пиши как хочешь, и не задумывайся, никогда. потом, как всё будет функционировать, будешь сидеть и исправлять, повышать читаемость. обычно это так делается :) |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
пример: var dump = function(variable, useAlert){ if(useAlert){ alert(variable); } else { console.log(variable); } }; ещё пример - функция ожидает объект в качестве аргумента. если вызвать её без ничего, то будет ошибка при попытке обращения к info, как к объекту. var ajax = function(info){ info = info || {}; makeReq( info.url ); }; сюда же относится обычная строчка в обработчике клика var handler = function(e){ e = e || window.event; // .... } ещё пример - используется в GCC при сжатии - выполнится выражение справа, если выражение слева вернёт false var foo = function(){ alert("Foo called!"); }; var bar = function(dontCallFoo){ dontCallFoo || foo(); }; bar("я уже не falsy"); falsy значение : var foo = function(){ alert("Foo called!"); }; var bar = function(dontCallFoo){ dontCallFoo || foo(); }; bar(/* undefined */); |
melky, в ваших примерах демонстрируется вынужденная необходимость проверок для обеспечения работоспособности и безошибочности кода (проверка на существование, выбор используемого объекта через ||), я же пытаюсь выяснить несколько другое.
Попытаюсь сформулировать на другом примере. Например, есть функция, которая должна присваивать переменной n значение 2. Обычно её реализуют так. function f() { if (n != 2) n = 2; } То есть вставляют проверку и не присваивают переменной n значение 2, если оно там уже хранится, хотя можно было сделать так: function f() { n = 2; } То есть присвоить переменной n значение 2 в любом случае (переприсвоить в случае, если там итак было уже значение 2). А так как обычно используют первый способ, отсюда и вопрос: в чём смысл выполнения таких проверок (стиль, производительность или что-то другое). |
Цитата:
|
Цитата:
Например, <div id="myDiv"></div> <script> function setColor(value) { if (myDiv.style.color != value) myDiv.style.color = value; } </script> Цитата:
|
Цитата:
|
Цитата:
|
Может быть у кого-нибудь есть ещё какие-нибудь предположения по этой теме??
|
Цитата:
if ( value !== 'чему то там' ) { elem.style[ 'property' ] = value; } |
Цитата:
Для обычных переменных идёт сравнение операций чтения и записи, здесь наверное можно и не проверять. А для свойств, связанных с прорисовкой, в случае, если после каждого присваивания произойдёт перерисовка, идёт сравнение чтения и записи + перерисовки, здесь наверное имеет смысл осуществить проверку. Мне думается (здесь надо поискать как в реальности происходит данный процесс), что прорисовка как раз происходит после каждого присваивания. Если же заложены внутренние механизмы проверки и прорисовки не происходит, тогда над подобными проверками можно вообще не заморачиваться, так как они итак будут осуществлены. |
Цитата:
|
Цитата:
Цитата:
bes, почитай определение шаблона Особый случай |
Часовой пояс GMT +3, время: 16:33. |