Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   как сделать грамотно? (https://javascript.ru/forum/project/10030-kak-sdelat-gramotno.html)

_mad 16.06.2010 12:51

как сделать грамотно?
 
Всем привет!

В своих поделках у меня частенько проскакивает код типа:

//это типа глобальная переменная
var counter=0;

function DoSomeWork(){
/*...что то еще*/

if(count == A)
  {
   //как то изменяем глобальную переменную:
   counter ++;
   
   //что то делаем еще:
   /*
   ...some code
   */
  }

}


В общем состояние храниться в глобальной переменной. Маразмом я таким знаимаюсь, например, если пользователь не должен иметь возможность выделить больше трех checkbox`офф в форме.

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

Kolyaj 16.06.2010 12:59

Лучше перейти к объектно-ориентированности. Но если приложение небольшое, то можно и замыкания. Как вариант
var doSomeWork = (function() {
    var counter = 0;
    return function() {
        // код функции
    }
})();

Gozar 16.06.2010 20:57

DoSomeWork.counter = 0;
функция тоже объект.

B~Vladi 20.06.2010 00:11

Цитата:

Сообщение от Gozar
функция тоже объект.

Это не значит что её нужно засирать.

Gozar 20.06.2010 12:23

Цитата:

Сообщение от B~Vladi (Сообщение 60198)
Это не значит что её нужно засирать.

В каком смысле?
counter относиться к функции, так почему бы ему не быть её свойством?
не понимаю вашего упрёка.

B~Vladi 20.06.2010 12:44

Цитата:

Сообщение от Gozar
counter относиться к функции, так почему бы ему не быть её свойством?

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

Gozar 20.06.2010 13:37

Цитата:

Сообщение от B~Vladi (Сообщение 60242)
Аналогичный пример можно привести с добавлением в DOM-элемент своих свойств. Я предпочитаю обходиться без этого. Тем более что осел преобразует их в атрибуты и если в дальнейшем мы будет их обрабатывать, могут возникнуть проблемы.

Пример с DOM я считаю совсем не аналогичный. Это пользовательская функция, и проблем вышеописанных с ней нет.

Цитата:

Сообщение от B~Vladi (Сообщение 60242)
А если переменных будет больше? Все что ли туда совать? Если какое-то свойство по имени совпадет с уже существующим?

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

B~Vladi 20.06.2010 13:43

Цитата:

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

Только для данного случая. Если код будет расширятся, придется многое переписывать с таким подходом. Лучше сразу делать делать так, чтобы в будущем не возникало геморроя. Поэтому обсуждать нужно сразу все варианты.
Цитата:

Сообщение от Gozar
Пример с DOM я считаю совсем не аналогичный. Это пользовательская функция, и проблем вышеописанных с ней нет.

Да, таких проблем нет, но если привыкнуть хранить данные в неположенных местах, проблемы легко могут появиться (как правило в совсем неподходящий момент).

B@rmaley.e><e 20.06.2010 13:50

Цитата:

Сообщение от B~Vladi
А если переменных будет больше? Все что ли туда совать? Если какое-то свойство по имени совпадет с уже существующим?

DoSomeWork.vars = {};
DoSomeWork.vars.counter = 0;

B~Vladi 20.06.2010 14:12

Цитата:

Сообщение от B@rmaley.e><e
DoSomeWork.vars = {};
DoSomeWork.vars.counter = 0;

Да пожалуйста, пишите так. Рано или поздно это аукнется. Не дай бог мне работать в команде с такими кодерами.


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