1. PHP / Говнокод #2329

    +154.8

    1. 1
    substr ("1111117495". ereg_replace ("[^0-9]", "", $user1->data["mobile_phone"]), -10) == substr ("1111117495". ereg_replace ("[^0-9]", "", $user2->data["mobile_phone"]), -10)

    Сравнение двух мобильных телефонов.

    Запостил: IHateBidloKod, 24 Декабря 2009

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

    • Хоть и говнокод, но автор весьма оригинально подошел к этой проблеме ))
      Ответить
    • Почему? Очень даже не говнокод. Очень красивое решение.
      В нем. 7(495)888-88-88 будет равно 888-88-88, или же будет равно 495-888-88-88.
      А единички - это от того, что поступающая информация может быть разной, в том числе и нулевой длинны.
      И кстати, это проверка 2-х московских телефонов, а не сотовых. ;-)
      Автору сравнения - пятерка. Атору говнопоста - незачод.
      Ответить
      • Именно мобильных:

        $user1->data["mobile_phone"]

        Не, ну если для PHP так нормально писать, то пожалуйста... Я уже давно не пишу на нем и счастлив.
        Ответить
      • Разрешите не согласиться.
        Хотя код, возможно, и решает свою задачу, но он:
        1. _абсолютно_ нечитаемый
        2. Использует константы, которые оказывается, состоят из 3-х частей: символа заполнителя, кода страны и кода города со всеми вытекающими последствиями.
        3. Не документирован

        ЗЫ: Я, если честно, пишу не на PHP, а на дотнете, но считаю, что сравнение телефонов не является даже близко той задачей, которая оправдывает использование совершенно нечитаемых конструкций в любой среде разработки.

        ЗЗЫ: Хотя бы константу "1111117495" можно было вынести в одельную переменную и задокументировать ее предназначение и составляющие.
        Не говоря уже о коде города и коде страны, которые вообще должны быть вынесены в конфигурацию.
        Ответить
        • как Вы по одной строчке решили, что он недокументирован?
          Ответить
          • Мы же не в "угадай мелодию" играем, правда?
            Автор запостил код. Комментариев я в нем не увидел.

            Кстати, практика показывает, что когда комментируешь код, то избегаешь писать такие опусы, ибо комментировать их исключительно сложно.
            Ответить
          • Говорят, в оригинальном коде ни одного коммента не было. Мой коллега пытался документировать, но из-за большого количества кадавров и откровенно зияющих дыр, это оказалось бесполезной затеей. Сейчас переписываем с нуля, но поскольку потребного описания функционала проекта нет, приходится копаться в старом коде.
            Ответить
        • Воот... допустим, что "7495" - еще можно сделать именованной константой. А "111111" - как ты назовешь? И где ты эти константы расположишь? Логично, что не прямо перед сравнением, а в каком нибудь конфиге... => Что бы понять это сравнение, нужно будет как минимум слазить в конфиг, ну или найти, где еще эти константы объявляются (и если ты их нашел, то это не дает еще уверенности, что они далее в каком-нибудь инклуде не переопределяются). Вынос в константу в данном случае, сделает код еще менее читаемым.
          Хотя согласен, при своей красивости, он с первого взгляда может быть непонятен. Так это скорее стимул учиться. Нефиг быдлокодить.
          Ответить
          • Учиться тут, мягко говоря, нечему. Я бы за это руки оторвал.
            А чтобы не быть голословным, приведу решение каким я его вижу.
            В С# я бы создал отдельный класс PhoneNumber у которого есть метод Parse и перегружен метод сравнения. И было бы:
            PhoneNumber phone1 = PhoneNumber.Parse(user1.mobilePhone);
            PhoneNumber phone2 = PhoneNumber.Parse(user2.mobilePhone);
            и потом
            if (phone1.Equals(phone2)) {
            ...
            }

            А вот в классе PhoneNumber можешь объявлять константы, писать любую извращенную логику какую только вздумается, читать конфигурацию откуда угодно, и т.п.
            Зато при таком дизайне вся логика и конвенции обработки телефонных номеров были бы в одном месте
            Ответить
          • Во-первых, по-сути, здесь нет константы "111111". Есть символ заполнитель "1" и длина нормализованного телефонного номера, равная 10.
            Во-вторых, раз это решение так сложно сделать читаемым - может это решение просто неоправданно сложно?
            Может не стоит изобретать гидроусилитель педалей велосипеду с квадратными колесами?
            Ответить
      • смысл кода вот в чём.
        Если это два мобильных телефона они сравниваются и не важно что приплюсовывается к каждому "1111117495", не важно.
        А вот если один номер допустим будет без кода города, то он будет считаться московским.
        Ответить
        • А если будет один и тот же московский номер, только в первом случае - без кода города, а во втором - с кодом...
          Ответить
          • Ах да! Там же -10 стоит! Какое элегантное решение :D
            Что может быть понятнее числа -10...
            Ответить
            • Сравнение хорошее, много случаев учитывает.
              Ну вынеси все эти substr выше.
              Ответить
    • Для поиска номеров телефонов используйте дополнительное поле в ДБ, состоящее только из циферек (INT). А в поля VARCHAR впихивайте наглядный вариант со скобками, минусами и плюсами.
      Ответить

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