?

Log in

No account? Create an account

Вт, 18 янв, 2005, 16:09
Microsoft®

Нет, други мои, не удержусь. Вот вам проверка из предыдущего поста. Такую красоту нельзя прятать, любуйтесь все:

<script language='javascript'>
  function validatePhone_contactPhoneNumber(oSrc){
    // if number is greater than 10 digits,
    // allow any digits, dashes and '+' at the beginning,
    // must have at least one dash.
    // this is what we are using for intl entry.

    var regx = new RegExp(/^\d+$/);
    var ndigitCount = 0;
    var strValue = document.all.contactPhoneNumber.value;
    var valueWithSpacesRemoved = '';
    // make sure all characters are either digits, dashes, periods, or '+'
    for (var i = 0;  i < strValue.length;  i++) {
      if (regx.test(strValue.charAt(i))) {
        ndigitCount++;
        continue;
      }
      if (strValue.charAt(i) == '-') {
        continue;
      }
      if (strValue.charAt(i) == ' ') {
        continue;
      }
      if (strValue.charAt(i) == '.') {
        continue;
      }
      return false;
    }
    //must have at least 4 digits
    if(ndigitCount < 2){
      return false;
    }

    return true;
  }
</script>

Предлагаю конкурс — кто найдёт больше несоответствий кода и комментариев…

Вт, 18 янв, 2005 06:41 (UTC)
_pk_sly

гыыыыы 8))))) смеялся до упаду! 8))))))

Параметр функции oSrc не используется, а используется document.all.contactPhoneNumber.value

valueWithSpacesRemoved не используется

Знак "+" упоминается в комментах, но не в коде 8)

Но САМЫЙ перл, из-за чего, собственно, функция и не работает - это метод test, который должен вызываться у СТРОКИ, а не у регэкспа! 8)))))

//must have at least 4 digits
if(ndigitCount < 2){

на это уже можно даже не обращать внимания 8)

вообще, конечно, функция требует гораздо меньше кода, чем написано. но при этом ещё и будет работать! 8)

Боюсь представить, как написано ядро Windows! 8) (шутка - его писал другой, грамотный, программист из DEC)

Вт, 18 янв, 2005 06:56 (UTC)
egorius

Не, можно и у регэкспа. Не работало как раз из-за того, что номер начинался с плюса.
Кстати, перечислены далеко не все несоответствия :)
А вот ещё народная забава: понять, что же должна была делать эта функция…

Вт, 18 янв, 2005 07:09 (UTC)
_pk_sly

Нунизнаю. У меня в MSDN ясно написано: "The RegExp object has no methods". А у строки - есть. Хотя.. сейчас проверил - на самом деле, работает test и у regexp'а.

А вот ещё прикол этого куска кода: запись /^\d+$/ уже сама по себе является regexp'ом и инициирование этим объектом другого регэкспа ни к чему хорошему не приводит 8)))) (а именно приводит к нереализуемому выражению). Правильно было написать x=new RegExp("^\\d+$"); (на сколько вообще целесообразно использование regexp в этой функции). Или strValue.charAt(i).test(/\d/)

Что функция должна была делать по замыслу, примерно написано в комментарии в начале.

Вт, 18 янв, 2005 07:17 (UTC)
egorius

Правильно было бы написать либо в цикле '0' <= ch && ch <= '9', либо регэксп, но без цикла и совсем другой…
А в комментарии написано следующее: если в номере больше десяти цифр, то… А если не больше? :)

Вт, 18 янв, 2005 07:28 (UTC)
_pk_sly

8)

Это мне напоминает обсуждение одного проекта, когда я сильно возмущался, меня спросили, что там, на мой взгляд, можно улучшить. Меня этот вопрос просто поставил в тупик.. Там ничего нельзя было улучшить. Надо было всё целиком выкинуть и написать с нуля по-человечески.

Вс, 6 фев, 2005 08:57 (UTC)
sobaker

Потрясающе прекрасно. Мне понравилось continue/continue/continue и return false в конце тела цикла.

Вс, 6 фев, 2005 12:48 (UTC)
egorius

Шедевр индусского народного творчества…