Оптимизация – главное не перестараться

Разберем простой пример. Возьмем код, и поэтапно будем производить его оптимизацию. Итак, напишем скрипт, который будетвыводить некоторый текст.

<script>
function intext(){
document.getElementById('outbox').innerHTML = '<b>Текст</b>';
}
</script>
<input type="button" value="Кликни" onClick = "intext()">
<div id='outbox'></div>

 

Здесь используется слой, id которого «outbox». При наступлении события onClick, выполняется функция intext(). Функцция вставляется html – код “<b>Текст</b>” в слой с id «outbox». Тест после выполнения скрипта будет выведен в окно браузера как Текст.

Первая модификация: Будем передавать id элемента страницы в функцию в качестве аргумента.

<script>
function intext(id_result){
document.getElementById(id_result).innerHTML = '<b>Текст</b>';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')">
<div id='outbox'></div>

Тогда мы можем использовать эту функцию более универсально.

<script>
function intext(id_result){
document.getElementById(id_result).innerHTML = '<b>Текст</b>';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')">
<div id='outbox'></div><br>
<input type="button" value="Кликни" onClick = "intext('outbox2')">
<div id='outbox2'></div><br>
<input type="button" value="Кликни" onClick = "intext('txt')"><br>
<div id='txt'></div>

Шаг два: При нажатии на кнопку (событие onClick) в соответствующем блоке появляется запрограммированный текст, но на этом шаге id элемента страницы и выводимый текст будут передаваться в функцию в качестве аргумента.

<script>
function intext(id_result, outtext){
document.getElementById(id_result).innerHTML = outtext;
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox','Текст 1')"><br>
<div id='outbox'></div><br>
<input type="button" value="Кликни" onClick = "intext('outbox2','Текст 2')"><br>
<div id='outbox2'></div><br>
<input type="button" value="Кликни" onClick = "intext('outbox3','Текст 3')"><br>
<div id='outbox3'></div><br>

 

Шаг три: Выключатель. Теперь запрограммируем кнопку на выполнение двух простых действий. При первом нажатии будет выводится текст «on», повторное нажатие приведет к выводу текста «off».

<script>
function intext(id_result){
if(document.getElementById(id_result).innerHTML == 'on')
document.getElementById(id_result).innerHTML = 'off';
else document.getElementById(id_result).innerHTML = 'on';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br>
<div id='outbox'>on</div><br>

 

Разумым будет усовершенствовать участок кода:

if(document.getElementById(id_result).innerHTML == 'on')
document.getElementById(id_result).innerHTML = 'off';
else document.getElementById(id_result).innerHTML = 'on';

Перепишем его следующим обазом:

document.getElementById(id_result).innerHTML = (document.getElementById(id_result).innerHTML == 'on'?'off':'on');

Оператор: expression ? operator 1 : operator 2 - тернарный оператор.

Что можно интерпретировать, как «если expression, то operator 1, иначе operator 2», что по сути эквивалентно обычному оператору if-else.

Однако, между этими операторами есть разница, в первом «operator 1» – это один оператор и не более, в качестве альтернативы «operator 2» - то же самое - один оператор.

Модифицированный код:

<script>
function intext(id_result){
document.getElementById(id_result).innerHTML = document.getElementById(id_result).innerHTML == 'on'?'off':'on';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br>
<div id='outbox'>on</div><br>

Шаг четыре: две функции. Усложним наш пример. Теперь кнопка будет переключать не только надписи, но и цвет текста.

<script>
function intext(id_result){
document.getElementById(id_result).innerHTML = document.getElementById(id_result).innerHTML == 'on'?'off':'on';
document.getElementById(id_result).style.color = document.getElementById(id_result).innerHTML == 'on'?'green':'red';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br>
<div id='outbox'>on</div><br>

Теперь в борьбе за байты, точнее за размер скрипта, пишем тоже самое, но короче.

<script>
function intext(id_result){
var obj = document.getElementById(id_result);
obj.innerHTML = obj.innerHTML == 'on'?'off':'on';
obj.style.color = obj.innerHTML == 'on'?'green':'red';
}
</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br>
<div id='outbox'>on</div><br>

 

В результате был создан объект obj, который унаследовал все методы и свойства элемента с id, который передается в функцию.

Задача разработчика, писать не только эффективные, но и компактные скрипты, чтобы не интернет-страницы не наращивали весу и быстро открывались на стороне пользователя. Переписываем скрипт:

<script>function intext(id_result){var o=document.getElementById(id_result);var d=o.innerHTML;
o.style.color=(o.innerHTML=d=='on'?'off':'on')?(o.innerHTML=='on'?'green':'red'):'';}</script>
<input type="button" value="Кликни" onClick = "intext('outbox')"><br><div id='outbox'>on</div><br>

В чем фокус?

- «obj.innerHTML» встречался в коде три раза, значит его можно сделать ссылку на него. Это и было реализовано.

- Имя переменной obj сократили до одного символа «о»

- Модифицировали код:

obj.innerHTML = obj.innerHTML == 'on'?'off':'on';
obj.style.color = obj.innerHTML == 'on'?'green':'red';

Получили:

o.style.color=(o.innerHTML=d=='on'?'off':'on')?(o.innerHTML=='on'?'green':'red'):'';

 

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

Мы перестарались! Попробуйте обратиться к данному коду через месяц, чтобы его как-то подправить, и вы поймете, что уже прошло пол часа, а вы все еще разбираетесь, что же тут написано. Отсюда вывод:

- Не увлекайтесь с именами переменных, используйте логически понятные имена.

- Пишите каждый оператор в отдельной строке.

- Содержимое составного оператора { }, пишите с отступом, с левой стороны.

- Оператор else и набор альтернативных операторов или оператор, рекомендуется переносить на новую строку.

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

 

Добавить комментарий


Защитный код
Обновить

Разработчику

Скрипты