Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   оптимизация, как правильнее? (https://javascript.ru/forum/misc/53817-optimizaciya-kak-pravilnee.html)

polecat 19.02.2015 20:16

оптимизация, как правильнее?
 
Здравствуйте.
Я новичок в javascript (да и вообще в программировании). Писал скрипт к своему проекту и обратил внимание, что листинг получается монструозным за счёт того, что я практически не использую переменных, а оперирую напрямую с элементами DOM.
Например:
if (document.getElementById(tested_fields[7]+string_number).value.substring((document.getElementById(tested_fields[7]+string_number).value.indexOf('\'',res_find)),(document.getElementById(tested_fields[7]+string_number).value.indexOf('\'',res_find)+2))=="''"){
  res_find=(document.getElementById(tested_fields[7]+string_number).value.indexOf('\'',res_find))+2;
} else {
  enum_flag=1;
  res_find=(document.getElementById(tested_fields[7]+string_number).value.indexOf('\'',res_find))+1;
}

Когда-то я слышал, что имеет смысл избегать, где это возможно, лишних переменных (экономить память) и как-то на автомате стараюсь без них обходиться :)
Меня внешний вид моего кода не напрягает совершенно и в принципе мне так удобно, но вдруг задумался, а не повлияет ли такой вид записи на скорость работы кода в худшую сторону?
Какой код будет работать быстрее, мой, или такой?:
var string1 = document.getElementById(tested_fields[7]+string_number).value;
if (string1.substring(string1.indexOf('\'',res_find),(string1.indexOf('\'',res_find)+2))=="''"){
  res_find=(string1.indexOf('\'',res_find))+2;
} else {
  enum_flag=1;
  res_find=(string1.indexOf('\'',res_find))+1;
}

И как вообще писать правильнее с точки зрения "культуры кода"?

danik.js 19.02.2015 21:26

Цитата:

Сообщение от polecat
имеет смысл избегать, где это возможно, лишних переменных (экономить память)

:lol:

danik.js 19.02.2015 21:31

Цитата:

Сообщение от polecat
культуры кода

Боюсь это понятие вообще не применимо к твоему коду :)

рони 19.02.2015 21:32

:-?
Цитата:

Сообщение от melky
«Программы должны быть написаны так, чтобы их могли читать люди, и лишь иногда так, чтобы их могли выполнять машины»


danik.js 19.02.2015 21:37

Че хоть скрипт твой делать должен? Кавычки зачем-то считает?

Safort 19.02.2015 22:01

polecat,
Цитата:

И как вообще писать правильнее с точки зрения "культуры кода"?
Второй вариант правильнее. Просто потому, что его гораздо удобнее читать.

Цитата:

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

danik.js 20.02.2015 06:02

Вот код, делающий тоже самое (если я не ошибся):
var quote = '\'';
var string1 = document.getElementById(tested_fields[7]+string_number).value;
var quotePos = string1.indexOf(quote, res_find);
res_find = quotePos + 1;
if (string1[quotePos + 1] == quote){
  res_find += 1;
} else {
  enum_flag=1;
}

Можно еще регулярку использовать - код станет короче.

Твои косяки:
1) Почему tested_fields[7] а не 43 или 777? Магических чисел быть не должно.
2) Почему такое дибильное именование через подчеркивание? В js такой стиль не используют. Достаточно посмотреть на имена объектов из браузерного окружения чтобы понять это.

polecat 20.02.2015 15:26

Цитата:

Сообщение от danik.js (Сообщение 357412)
Твои косяки:
1) Почему tested_fields[7] а не 43 или 777? Магических чисел быть не должно.
2) Почему такое дибильное именование через подчеркивание? В js такой стиль не используют. Достаточно посмотреть на имена объектов из браузерного окружения чтобы понять это.

Ох вы и резкий :)
Написал же, только учусь.
По пунктам:
1) Потому, что это маленький кусочек выдернутый из огромной процедуры с целью продемонстрировать пример "внешнего вида". Вообще там массив полей, которые я проверяю. Тут можно было бы и просто имя поля вставить, но выше мне нужно именно массив перебирать, а тут я просто использую элемент массива, потому, что мне так удобнее (всё равно он сформирован).
2) Потому, что мне так понятно назначение переменной. В учебнике читал, что нужно называть понятно и в одном стиле, остальное не важно - вот и соответствую. Где почитать как называть переменные, что-бы не вызывать припадков смеха у "бывалых"?
3) Этот кусочек ищет первую одинарную кавычку в строке, и смотрит что стоит за ней. Если вторая одинарная кавычка то...
Там дальше длинно :)
По поводу памяти - это мне рассказывали году так в 95м, при изучении паскаля. С тех пор я с программированием не сталкивался особо, а сейчас появилось желание поковыряться :)

2 Safort Спасибо. Это я и хотел узнать. :)

danik.js 20.02.2015 16:46

Цитата:

Сообщение от polecat
в одном стиле

Как бы в разных языках программирования есть свои общепринятые стайл-гайды, которым в том числе соответствует именование встроенных объектов (если они есть в окружении) и популярных библиотек. И если отойти от общепринятого стиля, то "одного стиля" ну никак не получится.
И смеялся я не над стилем, а над способом "экономии памяти" :D
Цитата:

Сообщение от polecat
По поводу памяти

Переменные действительно занимают память. Но ты забыл, что вызов функций занимает процессорное время. Вот только памяти завались, тем более ссылка занимает мизерный объем, а процессор надо беречь по возможности. Особенно учитывая "мобилизацию" аудитории.

polecat 20.02.2015 17:03

А как лучше тогда делать, если я не только яваскрипт использую:
1 В разных средах использовать разные стили?
или
2 Везде использовать одинаковый стиль?

По поводу переменных, не то, что-бы я забыл, что вызов функций занимает процессорное время. Просто я не в курсе, что обращение к DOM модели, это вызов функции. Как то я яваскрипт начал изучать с конца - сначала понадобилась какая-то мелочь, я нашёл как это люди делают, пристроил у себя на странице, потом ещё понадобилось и.т.д.
Сейчас уже кое в чём разбираюсь (в нужных мне пределах) но до изучения базы руки так и не дошли. :)
Вот поэтому и возникают иногда такие вопросы.
Спасибо, что отвечаете :)
Да, первое представление о программировании я получил 20 лет назад в институте изучая турбопаскаль. и там нас сильно напрягали экономией памяти, а процессорное время для наших задач как-то не особо важно было :)


Часовой пояс GMT +3, время: 18:17.