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

    +155

    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
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    switch ( count($args) )
    		{
    			case 0:
    				return $obj->$method( );
    			case 1:
    				return $obj->$method( $args[0] );
    			case 2:
    				return $obj->$method( $args[0], $args[1] );
    			case 3:
    				return $obj->$method( $args[0], $args[1], $args[2] );
    			case 4:
    				return $obj->$method( $args[0], $args[1], $args[2], $args[3] );
    			case 5:
    				return $obj->$method( $args[0], $args[1], $args[2], $args[3], $args[4] );
    			case 6:
    				return $obj->$method( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5] );
    			case 7:
    				return $obj->$method( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6] );
    			case 8:
    				return $obj->$method( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7] );			
    			case 9:
    				return $obj->$method( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8] );			
    			case 10:
    				return $obj->$method( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8], $args[9] );			
    			case 11:
    				return $obj->$method( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8], $args[9], $args[10] );			
    			case 12:
    				return $obj->$method( $args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8], $args[9], $args[10], $args[11]   );			
    		}
    		throw new MWException( __CLASS__.": too many arguments to method called in ".__METHOD__ );

    Запостил: thekiba, 16 Апреля 2014

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

    • Нормальная оптимизация, чо)
      Правда исключение в конце зря бросил, можно было все таки call_user_func_array заюзать для остальных случаев, хоть он и тормозной...
      Ответить
      • Вот блин, как можно было написать интерпретатор, в котором встроенная сишная функция будет работать медленнее говна со свичом и перепропихиванием аргументов? :)
        Ответить
    • >too many arguments to method called in ".__METHOD__
      Я б на трёх-четырех остановился.
      В этом даже профит есть - такой полезный фильтр от быдлокодеров.
      Ответить
      • cleaned
        Ответить
        • >и среда разработки не скажет ему "Ты - ебень".
          Тут уже был тип, который жаловался что VS не даёт ему написать более 128 вложенных ifов.
          >А потом не обидно будет?
          Нет. Ограничения на самом деле стимулируют фантазию и умственную деятельность в целом.
          В множестве трудов описывались причины по которым так или иначе более трёх аргументов (и именованные) ведут к неправильному стилю кодинга. Правило 5 +/- 2, сиплюструп, итд.
          3 аргумента вариаций в котором они могут быть написаны 3!=6, 4! - 24, итд. В памяти удержать сиё - невозможно.
          В функциональщине рассудительные математики вообще свели всё к одному.
          Ответить
          • Ну и стоит упомянуть о тестируемости. Функцию со 100500 аргументами нереально покрыть тестами.
            Ответить
          • cleaned
            Ответить
    • Кажется мы видим это в четвертый или пятый раз. Ещё были варианты на Action Script и вроде бы на JS. Мне даже начинает казаться что эта оптимизация от боянистов любителей придумывать странные оптимизации.
      Ответить
      • В груви 42 раза (постили трижды).
        И вроде кресты были (бустятинка с переменным числом крестошаблонов), и еще какой-то язык без вараргов, точно не помню.
        Ответить
        • Из апача (или его проекта) типа того.
          Ответить
    • Быть может, это имеет смысл для реализаций с JIT-компилятором, если тот не умеет оптимизировать Function.apply (или его аналог). В PHP JIT вроде ж как нет.
      Ответить
      • В пхп всё через костыли. Для оптимизации байткода приходится загружать расширения типа XCache или APC, у которых на данный момент оптимизация почти никакая.
        Ответить
        • AFAIK эти расширения же просто кешируют байткод, безо всяких оптимизаций. "Из коробки" PHP вообще каждый раз файл парсит и выполняет. Я вообще удивлён, что у PHP байткод есть. Я думал, что они до сих пор кипятят выполняют AST.
          Ответить
          • Нет, в них есть и оптимизатор. Некоторые последовательности опкодов заменяются «более эффективной» последовательностью. Правда, правил там раз-два и обчёлся.
            Ответить
            • А, ну это т.н. peephole-оптимизация. Она и в CPython есть. Это даже близко не JIT. Да и к кешу байткода она вряд ли имеет какое-то отношение.
              Ответить
    • Too many, блять? Серьезно?
      Ответить
      • Серьезно. 5-6 не keyword аргументов - уже много.
        Ответить
        • гость наверное не знает про число различных перестановок.
          Ответить

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