ЙажаСценарий / Говнокод #18810 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
function checkForm(form, mustform){
	error=0;
	if(mustform){
		for(i in mustform) if(form.elements[mustform[i]]){
			if(!form.elements[mustform[i]].value){
				error=1;
				jQuery(form.elements[mustform[i]]).next().remove();
				jQuery(form.elements[mustform[i]]).parent().append('<div style="color:red">поле обязательно к заполнению</div>');
			} else jQuery(form.elements[mustform[i]]).next('div').remove();
		}
		if(error>0) return false; else return true;
	} else return true;
}

такого codestyle не встречал))

Запостил: progsmile progsmile, (Updated )

Комментарии (23) RSS

  • > error=0;
    > error=1;
    > if(error>0) return false; else return true;
    Вроде и знает о булах, но не юзает...
    Ответить
        • Проверяет, что у mustform действительно есть своё, не унаследованное от прототипа поле i.

          А почему нельзя вызвать mustform.hasOwnProperty(i) - х.з. Об этом надо спросить 1024--.
          Ответить
            • Пишем как обычно. И бьём по рукам в процессе код-ревью за всякие неочевидные финты ушами типа патчинга прототипа Object или ненужные игры со скоупом. Одно дело - когда пишешь библиотеку типа jQuery, которую будет использовать каждая обезьяна и она обязана быть непробиваемой (насколько это возможно), другое - когда пишешь бизнес-логику на основе существующего фреймворка, которую после тебя ещё кто-то будет поддерживать.
              Ответить
          • >А почему нельзя вызвать mustform.hasOwnProperty(i) -
            Там какие-то проблемы с биндингом вроде были, вы мне еще разницу между питоном и js объясняли, так?
            Ответить
        • Если подействовать этим на φ, эта самая φ выполнится для всех свойств mustform, которые действительно есть в mustform.

          Почему так?
          1. Простой for..in вызовет φ и для прототипа:
          function A(){}
          A.prototype.x = 3;
          var a = new A;
          a.y = 5;
          for(var i in a) console.log(i); // x y

          И вот мы решили использовать hasOwnProperty.
          2. Если мы хотим создать словарь без всякого мусора в прототипе (http://govnokod.ru/16567#comment250319), то hasOwnProperty у нас не будет:
          var a = Object.create(null);
          a.x = 3;
          for(var i in a) if(a.hasOwnProperty(i)) console.log(i);
          // Uncaught TypeError: a.hasOwnProperty is not a function(…)

          И вот мы решили использовать hasOwnProperty для объектов в стиле ООП и простой for..in для объектов-словарей, ведь у них ни прототипа, ни hasOwnProperty.
          3. Если в объект добавить конструктор/прототип, он проявит новые свойства:
          var a = Object.create(null);
          a['__proto__'] = {x: 3}; // вот был у нас пользователь __proto__, хотим сохранить, что он ввёл тройку в x
          a['y'] = 5;
          for(var i in a) console.log(i); // x y

          Наконец мы решаем всё проверять, но взять hasOwnProperty там, где он действительно будет
          4. Кажется, работает:
          var a = Object.create(null);
          a['__proto__'] = {x: 3};
          a['y'] = 5;
          for(var i in a)
            if({}.hasOwnProperty.call(a, i))
              console.log(i); // y

          Но это же ECMAScript, как может что-то работать без подвохов?
          1. Кто-нибудь может изменить Object.prototype:
          Object.prototype.hasOwnProperty = function(){ return true; }

          Но это уже ССЗБ и неизлечимо.
          2. В Хроме __proto__ уже не работает и выводится как обычное поле, в Node.js оно вроде бы ещё считается особенным, поэтому результаты кода №3 и кода №4 показаны как в Node, а в браузере добавится итерация по __proto__.

          Итого:
          1. Обращение к словарю:
          {}.hasOwnProperty.call(dict, key) && dict[key]

          2. Вопрос читателям: Как пройтись по всем свойствам словаря?
          Ответить
            • Но до них один шаг:
              var PREFIX = '.';
              
              function Dict(){
                this.data = {};
              }
              
              Dict.prototype.setValue = function(key, value) {
                this.data[PREFIX + key] = value;
              };
              
              Dict.prototype.getValue = function(key) {
                return this.data[PREFIX + key];
              };
              
              Dict.prototype.keys = function() {
                var keys = [];
                
                for(var key in this.data)
                  if(key.substring(0, PREFIX.length) === PREFIX)
                    keys.push(key);
                
                return keys;
              };
              
              Dict.prototype.values = function() {
                var data = this.data;
                return this.keys().map(function(key){ return data[key]; });
              };

              Вроде бы должно работать.
              Ответить
              • Да я смотрю, у вас там всё есть, просто нужно написать свой foreach.
                Ответить
                • Пришло время написать свой foreach
                  foreach сам не напишется, напиши его, напиши его еще раз!
                  Тупые лохи на всех возможных языках юзают готовый, но я слишком умный для этого!
                  Ответить
          • Не заводить словарей от прототипов с перечисляемыми свойствами.
            Ответить
    • >дерьмовый ужас
      Вот как точно и ёмко одной фразой описал ECMAScript!
      Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8