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;

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

Gozar 20.06.2010 14:40

B~Vladi,
Не делайте из мухи СЛОНА. Я прекрасно понимаю что вы говорите о расширяемости. Однако здесь речь идет не об этом.
Цитата:

Сообщение от _mad (Сообщение 59721)
Как избавиться от глобальной переменной?

Вы не будете со мной работать, мы находимся в разных городах и возможно мирах, так что беспокоиться вам не о чём ;)

B~Vladi 20.06.2010 15:46

Цитата:

Сообщение от Gozar
Не делайте из мухи СЛОНА.

Вопрос был как ГРАМОТНО сделать. Вот я и отстаиваю свой подход.
Цитата:

Сообщение от Gozar
Вы не будете со мной работать

Я не про кого-то конкретного говорю.

Gozar 20.06.2010 16:01

Цитата:

Сообщение от B~Vladi (Сообщение 60254)
Вопрос был как ГРАМОТНО сделать. Вот я и отстаиваю свой подход.

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

subzey 20.06.2010 18:10

Я обычно делаю так:
<button onclick="run()">run()</button>
<script type="text/javascript">
function run(){
	if (!arguments.callee.runTimes) arguments.callee.runTimes = 0;
	if (++arguments.callee.runTimes > 3){
		alert("Эту функцию можно вызвать только три раза!");
		return;
	};
	/* далее — обычный код функции */
	alert("Я сработало!")
}
</script>

Ну, учитывая, что arguments.callee — это ссылка на функцию, которая сейчас выполняется.

Kolyaj 20.06.2010 20:51

Как аргумент против свойств функции: они не сожмутся обфускатором. Но это не для всех аргумент :)

рони 21.06.2010 00:33

subzey,
может так ?
if (++arguments.callee.runTimes < 4){

alert("Эту функцию можно вызвать только три раза!");

return;

};
или
if (arguments.callee.runTimes++ < 3){
alert("Эту функцию можно вызвать только три раза!");
return;
};

subzey 21.06.2010 13:03

рони,
«Эту функцию первые три раза запускать нельзя»? :)

рони 21.06.2010 17:23

subzey,
ок понял


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