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

    +163

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    switch(true) {
                case ((0x7F & $bytes) == $bytes):
                    // this case should never be reached, because we are in ASCII range
                    // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                    return chr(0x7F & $bytes);
    
                case (0x07FF & $bytes) == $bytes:
                    // return a 2-byte UTF-8 character
                    // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                    return chr(0xC0 | (($bytes >> 6) & 0x1F))
                         . chr(0x80 | ($bytes & 0x3F));
    
                case (0xFFFF & $bytes) == $bytes:
                    // return a 3-byte UTF-8 character
                    // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                    return chr(0xE0 | (($bytes >> 12) & 0x0F))
                         . chr(0x80 | (($bytes >> 6) & 0x3F))
                         . chr(0x80 | ($bytes & 0x3F));
            }

    В одной из реализаций JSON.php

    * @package Services_JSON
    * @author Michal Migurski <[email protected]>
    * @author Matt Knapp <mdknapp[at]gmail[dot]com>
    * @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
    * @copyright 2005 Michal Migurski
    * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $
    * @license http://www.opensource.org/licenses/bsd-license.php
    * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198

    Запостил: lobovkin, 10 Октября 2011

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

    • >switch(true)
      Я чего-то не понимаю или это действительно пиздец?
      Ответить
      • если правильно понимаю я, то это писал ненавистник if..elseif
        Ответить
      • я часто применяю, ибо switch выглядит куда красивее чем простыня из эльзеифов. Хотя на любителя, конечно
        Ответить
    • А собственно в чем тут говно?
      Ответить
      • +1
        Ответить
      • видимо в отсутствии брейков. но при наличии ретурнов - они не обязательны.
        Ответить
      • На сколько я понимаю - первый кейс. Он вообще какой-то странный (особенно комментарий в нем). Т.е. любые значения int & 0x7F - это и есть ASCII range. По какой логике эти значения не попадают в ASCII range - надо спрашивать у автора (он очевидно чего-то в $bytes дописывал...). Ну и кроме того, если уж известно, что 0x7F & $bytes == $bytes, то зачем chr(0x7F & $bytes), когда можно было chr($bytes). Хотя, если автор утверждает, что в этот кейс никогда не попадут (зачем он его писал вообще тогда?) то это не важно.
        Ответить
        • Может быть этот код отрабатывал только когда $bytes >= 128. Но автор был в этом не совсем уверен.
          Ответить
      • Нетрадиционное использование switch.
        Ответить
        • Есть еще интеренсое предположение. А что если в далеком будущем (если оно существует для PHP), интерпретатор научится делать предсказание веток. И в switch'е, в котором разные ветки могуть быть выбраны исходя из одного и того же значения получатся очень интересные эффекты. Например, при $bytes < 128 оба выражения (0x07FF & $bytes) == $bytes и (0x7F & $bytes) == $bytes будут верными, и тогда это уже просто рулетка получится.
          Ответить
          • Не будет. Слишком много (говно)кода посыпется.

            В динамических языках, допускающих выбор не по константам, этот оператор бессмысленен (разве что путать новичков).
            Ответить
      • любой код на говноязыке по определению говно
        Ответить
    • показать все, что скрытоvanished
      Ответить

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