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

    +140

    1. 1
    2. 2
    3. 3
    4. 4
    define('SECOND', 1);
    define('MINUTE', SECOND*60);
    define('HOUR', MINUTE*60);
    // ...

    количество секунд в секунде — это определённо что-то новое.

    Запостил: fidelcomandante, 16 Сентября 2013

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

    • Для общности же:
      5 * MINUTE + 30 * SECOND
      Ответить
    • Вполне здравая мысль. Если даты будут приходить в миллисекундах, то нужно будет передефайнить SECONDS в 0.001, а другой код менять не нужно будет. Вероятность получить даты в миллисекундах совсем не нулевая, учитывая то, что в ж.скрипте они таки в миллисекундах.
      Ответить
      • > SECONDS в 0.001
        Небольшой фикс: в 1000. С остальным полностью согласен.
        Ответить
        • Ну это если делить, я думал автор умножать собирался.

          А, ну да, все, теперь понял
          Ответить
          • > я думал автор умножать собирался
            Ну тогда вместо 60 было бы 1/60.0 ;)
            Ответить
    • IntelliJ IDEA плюсанула бы тут такой код — если умножаешь на константу, равную 1, или прибавляешь нулевую, то она своими "Simplify" тебя рано или поздно заставит избавиться от красивого кода.
      Ответить
      • А её обмануть и сказать, что это "10 - 9" (или еще как-то закрутить) не проканает?
        Ответить
        • показать все, что скрытомакни себя в унитаз вниз головой, дружище
          Ответить
        • Статический анализатор это без проблем в единицу переведёт.
          Ответить
          • В php?
            Ответить
            • Я сейчас про IntelliJ IDEA говорю.
              Ответить
              • Ты вообще понимаешь, что качество статического анализа определяется в первую очередь языком и в языках со строгой статической типизацией работает априори лучше, чем в динамических?
                Ответить
                • Java. Мы сейчас занимаемся сравнением?
                  Ответить
                  • anonimb 8. 4. В поисках идеального языка -- 2013 -- 65536 с.
                    Ответить
                  • что java
                    IDEA - это иде не только для жабы
                    Ответить
                    • Капитаним?
                      Обсуждаем Pointless arithmetic expression - ну да, это не статический анализ.
                      Ответить
                      • ты просто начал за здравие, а закончил жабой
                        в идее всё хорошо будет и с динамическими языками, которые она умеет - и php, и js, с 1*100 без проблем разберётся
                        Ответить
                        • Я нигде не говорил, что оно плохо справляется с другими языками.
                          Ответить
                    • не только для жабы. преимущественно для жабы
                      Ответить
                      • на работе сейчас и жабьи проекты, и js SPA
                        всё в идее, на отлично
                        при этом, несмотря на поддержку и db, как инструмент идея заметно проигрывает даже oracle sql developer (хотя почему даже, sqldeveloper - хороший инструмент)
                        Ответить
                  • >IntelliJ IDEA плюсанула бы тут такой код
                    Ты начал сравнивать динамических пых с жавкой.
                    Ответить
                    • Не начал. Чел возмущается, что одна секунда в секунде - неужели он бы не возмущался на точно такую же коллекцию psfi?
                      Ответить
                      • >IntelliJ IDEA плюсанула бы тут такой код — если умножаешь на константу, равную 1, или прибавляешь нулевую, то она своими "Simplify" тебя рано или поздно заставит избавиться от красивого кода.
                        > то она своими "Simplify" тебя рано или поздно заставит
                        Начал.
                        Ответить
      • Просто в ПХП очень мало практики метапрограммирования, и люди боятся / не понимают инструметны, которые им должны в этом помагать. В языках, в которых это случается чаще есть специальные конструкции на случай, например, раскрытия макросов в бесполезный код, или подстановки таких констант, при которых выражения либо становятся бессмысленными, либо могут быть сокращены.
        Но это нормально, еще лет десять и ПХП дойдет до уровня простеньких яызков середины прошлого века.
        Ответить
        • Вы хотите видеть философствующих метапрограммирующих похапешников? я нет.

          P.S. В принципе, генерацию html, js и sql похапешным скриптом формально можно считать метапрограммированием...
          Ответить
          • define - это уже метапрограммирование, так что это свершившийся факт, а не прихоти какого-то wvxvw.
            Ответить
            • > это уже метапрограммирование
              Да никакой это не метапрограмминг, а банальнейшая константа. Причем только скалярная (инт, флоат, строка, бул, налл).

              Не надо путать пыходефайн с дефайнами в других языках :)
              Ответить
              • Нет, в ПХП, кстати, есть настоящие константы. Дефайны - это очень примитвный инструмент метапрограммирования. Точно так же как в Си.
                Ответить
                • Ну блин, я зря что-ли ман ман прочел перед тем как это писать? :) Константа это банальная, а не сишный дефайн: http://php.net/manual/en/function.define.php. Эдак вы и жабий public static final int x = 42 запишете в инструменты метапрограмминга...

                  В пхп, имхо, метапрограмминг проявляется только в reflection, в eval, и в обращении к переменным по имени аля $$x.
                  Ответить
                  • Та ну, ПХП документация написана ПХП программистами. Они сами не понимают, чего делают, смысла им доверять нету.
                    Ответить
                    • Мудрейший и всемогущий wvxvw, попирающий пятами небеса, знает тайны пыха, неведомые даже его создателю ;)

                      P.S. Ну мне лень открывать исходники, и смотреть чего делает дефайн.
                      Ответить
                      • В чем заключается разница?
                        - константа, это элемент программы, в свою очередь представленная с помощью элементов языка. const в ПХП так именно себя и ведет. Т.е. он создает объект языка, доступный через интроспекцию, его можно положить в неймспейс, как и другие элементы языка, он синтаксически соответствует нашему представлению о том, что такое константа.
                        Почему define не константа?
                        - Так же как и в Си, это инструметн за пределами языка, что-то, что позволяет внести новую конструкцию в язык (но только очень ограниченно). Инструмент тупо скопированый из Си, и по традиции из Си, где нет констант в принципе, но дефайны называют константами, продолжил эту традицию.
                        Ответить
                        • > внести новую конструкцию в язык
                          Ну какую конструкцию он туда вносит то? Этот define даже на парсер совершенно не влияет... Эти "константы" - любой идентификатор без доллара. Интерпретатор их хоть с дефайном, хоть без дефайна одинаково парсит. Небольшая разница будет только в рантайме, в зависимости от того, определили эту константу или нет:
                          echo TEST;
                          // Use of undefined constant TEST - assumed 'TEST'
                          // Выводит TEST
                          
                          define('TEST', 42);
                          echo TEST;
                          // Выводит 42
                          Нигде, кроме выражений, эти константы юзать нельзя. Здесь метапрограмминга не больше чем в жабьем public static final const.

                          > Инструмент тупо скопированый из Си, и по традиции из Си, где нет констант в принципе, но дефайны называют константами
                          Вот только не надо это сравнивать с сишкой. В сишке #define это действительно слабый инструмент метапрограмминга.
                          Ответить
                          • В ПХП нет ключевого слова TEST, все, что не начинается с доллара, должно быть ключевым словом, либо вызовом функции. Что мы сделали в этом случае - мы включили какую-то неведомую херню из-за пределов языка.

                            Самым показательным моментом в этом смысле является то, что что бы не объявлялось через дефайн нельзя положить в неймспейс, потому что это не объект языка.
                            Ответить
                            • > все, что не начинается с доллара, должно быть ключевым словом, либо вызовом функции
                              Объясните это интерпретатору пыхи, который в контексте выражений любое неизвестное ему слово считает именем константы.

                              > мы включили какую-то неведомую херню из-за пределов языка
                              Вне выражений эти define НЕ РАБОТАЮТ:[code=php]
                              define('TEST', 'foo');
                              function TEST { } // Здесь объявили TEST, не foo
                              $x = TEST(); // Здесь вызвали TEST, не foo
                              $y = TEST; // и только здесь TEST раскрылся в 'foo'
                              Ответить
                            • > что бы не объявлялось через дефайн нельзя положить в неймспейс, потому что это не объект языка
                              Ну в пыхе и переменную нельзя положить в неймспейс. Это теперь не объект языка?
                              Ответить
                            • > что бы не объявлялось через дефайн нельзя положить в неймспейс
                              А вот и фиг, все ложится. Правда через жопу (что, впрочем, характерно для пыховских неймспейсов):
                              namespace foo {
                                  define('TEST', 'global');
                                  define('foo\TEST', 42);
                                  define('bar\TEST', 100500);
                                  print TEST; // выведет 42. Нельзя положить в неймспейс? :)
                              }
                              Ответить
                              • Хз. раньше нельзя так было. У меня ПХП не установлен, и устанавливать не хочется чтобы проверить. Неужто их еще и приватными / публичными можно объявить? А локально внутри функции?
                                Ответить
                        • > Т.е. он создает объект языка, доступный через интроспекцию
                          Ну пожалуйста, define тоже доступен.
                          define('TEST', 'foo');
                          echo constant('TEST');

                          > его можно положить в неймспейс, как и другие элементы языка
                          В пыхе, к сожалению, далекооо не все можно положить в неймспейс ;) Вроде как только классы и функции.
                          Ответить
                          • Нет, это побочный эффект, но он свидетельствует о том, чем на самом деле, и с точки зрения языка это является.
                            constant - просто еще один пример заблуждения. Возможно даже умышленного заблуждения, чтобы не нагружать бедных ПХПпистов, им и так от всех этих маразмов не просто.
                            Что такое элемент языка? - это сущность из его системы описаная в терминах этого языка. Дефайн, напротив, это просто строка символов, которую убогий препроцессор умеет заменять на сериализрованое представление скалярного значения. Сериализированого таким образом, что оно может быть интерпретировано средствами языка.
                            Ответить
                            • > убогий препроцессор умеет заменять на сериализрованое представление скалярного значения
                              И почему же это "убогий пыховский препроцессор" подставляет ее только в выражения? Странно, не правда ли? :)

                              И как же это "убогий препроцессор" умудряется в рантайме подставлять значения? :)
                              function test() {
                                  echo TEST0 . "\n" . TEST1 . "\n" . TEST2 . "\n";
                              }
                              
                              for ($i=0; $i<3; $i++) {
                                  define('TEST' . $i, "foo" . $i);
                              }
                              test();
                              > constant - просто еще один пример заблуждения
                              И в чем заблуждение? В том, что есть пул констант, в котором рантайм их ищет в тот момент, когда они ему нужны (и высрав ворнинг, возвращает имя константы, если он ее там не нашел)?
                              Ответить
                              • > И почему же это "убогий пыховский препроцессор" подставляет ее только в выражения?
                                Потому что в других местах граматика не позволяет.

                                Еще раз, это никакой не пул констант. Это просто строки, которые потом чем-то заменяют.
                                Ответить
                                • > Это просто строки, которые потом чем-то заменяют.
                                  Угу. На этапе компиляции в p-code. Опкодом получения константы из пула ;)

                                  Ну т.е. грубо говоря, TEST экивалентно constant('TEST'), с точностью до ворнинга и дефолтного значения.
                                  Ответить
                        • Почитал исходники. Ничего интересного.

                          1) Когда компилятор видит неведомое слово в контексте выражений, он вкомпиливает опкод ZEND_FETCH_CONSTANT.
                          2) define() вызывает функцию рантайма zend_register_constant(), которая тупо (ну там не совсем тупо, но не суть) добавляет ее в хешмап zend_constants.
                          3) Рантайм выполняя опкод ZEND_FETCH_CONSTANT, вызывает zend_quick_get_constant() чтобы получить ее значение из zend_constants.

                          Ну и где здесь метапрограмминг? Весь код скомпилен в p-code задолго до исполнения тех самых define'ов.
                          Ответить
                          • P.S. Сейчас придет wvxvw, и скажет, что "ПХП интерпретатор написан ПХП программистами. Они сами не понимают, чего делают, смысла им доверять нету". И его гипотетическая концепция пыхо-define'ов, позаимствованных их сишки, навсегда останется единственно верной ;)
                            Ответить
                      • Ну я тоже слышал, что документации пыха доверять нельзя, надо самому читать исходники.
                        Ответить
                    • мощно! но справедливо
                      Ответить
    • > количество секунд в секунде — это определённо что-то новое
      sizeof(char) в C был явно раньше
      Ответить
    • Почему-то вспомнился java.util.concurrent.TimeUnit
      Ответить

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