Страницы

пятница, 17 сентября 2010 г.

Пишем понятный код

Давно хотелось написать что-то подобное, но все не знал как начать. И похоже начну с собственных боков, в принципе есть что в выражение: "на чужих ошибках люди учатся,а на чужих делают каръеру ". Вот обнаружил у себя с одной стороны безобидный вроде бы код :

REQ=getHttp();
var login=document.getElementById('login').value;
var email=document.getElementById('email').value;

var name=document.getElementById('name').value;
var paswd1=document.getElementById('paswd1').value;
var paswd2=document.getElementById('paswd2').value;

var str='login='+login+'&email='+email+'&name='+name+'paswd1='+paswd1+'&paswd2='+paswd2;
SendRequest2(REQ,'regis.php',str,'POST',ajax_regis);


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

REQ=getHttp();
var login=document.getElementById('login').value;
var email=document.getElementById('email').value;

var name=document.getElementById('name').value;
var paswd1=document.getElementById('paswd1').value;
var paswd2=document.getElementById('paswd2').value;
var phone=document.getElementById('phone').value;
var comments=document.getElementById('comments').value;
var city=document.getElementById('city').value;
var str='login='+login+'&email='+email+'&name='+name+'&paswd1='+paswd1+'&paswd2='+paswd2+'&phone='+phone+'&comments='+comments+'&city='+city;
SendRequest2(REQ,'regis.php',str,'POST',ajax_regis);

Так бы его и оставил, если б не начав его проверять я не понял, что
а) приходится постоянно переключать внимание со строки str на операции типа document.getElementById
б) строка str тяжело компоновалась в мысленное представление

Чтоб понять что не так, просто взглянем наш внутренний( тобишь тот, что у нас в голове) алгоритм проверки правильности строки
str.
Пошагово
1) наше внимание фокусируется на элменте "
login="
2) фокусируется на переменной
login
3) ищет в коде
var login=document.getElementById('login').value;
4) проверяет соответствие переменной login и значение аргумента функции
getElementById
5) возвращается к строке str и ищет следующий элемент типа "login="
6) находит, и заносит элемент "
login=" во внутреннюю допустим память, как обработанный
.....
повторяет шаг 1-6 для этого элемента добавляется дополнительный шаг поиска обрабатываемого элемента в списке уже обработанных.
......
Итак, сколько там у нас элементов, восемь?! А теперь приведу справку, при всей гениальности человека, среднестатистический индивид способен держать в оперативной памяти до 7 объектов ( наверно ученые имели ввиду оперировать ими ), да данный тезис наталкивает на дискуссию , но в приведенном примере алгоритма объектов явно больше. Да наш мозг работает быстро, и нам кажется, что мы даже не так обработаем данную строку, наверняка что-то оптимизируется, но это думаю потом, а первый раз по логике он сработает именно так, иначе появится вероятность ошибки.
После этих умозаключений предыдущий код переписал следующим образом:

REQ=getHttp();
var str='';
var login=document.getElementById('login').value;
str+='login='+login;
var email=document.getElementById('email').value;
str+='&email='+email;
var name=document.getElementById('name').value;
str+='&name='+name;
var paswd1=document.getElementById('paswd1').value;
str+='&paswd1='+paswd1;

var paswd2=document.getElementById('paswd2').value;
str+='&paswd2='+paswd2;


var phone=document.getElementById('phone').value;
str+='&phone='+phone;

var comments=document.getElementById('comments').value;
str+='&comments='+comments;

var city=document.getElementById('city').value;
str+='&city='+city;

SendRequest2(REQ,'regis.php',str,'POST',ajax_regis);

Вроде бы алгоритм проверки тот же, но длинных переводов фокуса внимание нет. Как по мне намног удобнее, кстати раньше в IBM был негласный( а может добровольно принудительный) программисткий стандарт - код любой функции не должен привышать в длинну больше 25 строк. Почему именно 25 строк, а потому что именно столько вмещалось в текстовом редакторе DOS.

Комментариев нет: