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

    +53

    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
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    protected function CreateClass($className, $params) {
    		switch (count($params)) {
    			case 0:
    				return new $className();
    				break;
    			case 1:
    				return new $className($params[0]);
    				break;
    			case 2:
    				return new $className($params[0], $params[1]);
    				break;
    			case 3:
    				return new $className($params[0], $params[1], $params[2]);
    				break;
    			case 4:
    				return new $className($params[0], $params[1], $params[2], $params[3]);
    				break;
    			case 5:
    				return new $className($params[0], $params[1], $params[2], $params[3], $params[4]);
    				break;
    			case 6:
    				return new $className($params[0], $params[1], $params[2], $params[3], $params[4], $params[5]);
    				break;
    			case 7:
    				return new $className($params[0], $params[1], $params[2], $params[3], $params[4], $params[5], $params[6]);
    				break;
    			case 8:
    				return new $className($params[0], $params[1], $params[2], $params[3], $params[4], $params[5], $params[6], $params[7]);
    				break;
    			case 9:
    				return new $className($params[0], $params[1], $params[2], $params[3], $params[4], $params[5], $params[6], $params[7], $params[8]);
    				break;
    			case 10:
    				return new $className($params[0], $params[1], $params[2], $params[3], $params[4], $params[5], $params[6], $params[7], $params[8], $params[9]);
    				break;
    			default:
    				echo "Too many arguments";
    				return null;
    				break;
    		}
    }

    Продолжение одного нашумевшего блокбастера: Радж и "шоколадная" фабрика.
    Исходники взяты из компонента JEvents для Joomla. Файл из папки "icalevent". Думаю что стоит сделать акцент на iCAL, есть в этом что-то особенное.

    Запостил: SunnyMagadan, 24 Октября 2012

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

    • A в этом что-то есть. Назвать свой проект так, чтобы начинался с J. Потом все будут думать, что он на Яве - а там хрясь, и ПХП притаисля!
      Ответить
      • J - не от Java, а от Joomla конкретно в этом случае
        Ответить
    • 1) Нахуя это в классе и не static?
      2) Хули оно называется CreateClass?
      3) Зачем break после return'а?
      4) Зачем echo?
      5) Reflection на таможне отобрали?
      6) Начерта вообще этото им понадобилось?
      Ответить
      • 6) Вызывать класс по его имени много где можно, например CodeIgniter вызывает класс контроллера по переданному имении в URI
        5) Не обязательно ебаться с рефлекшинами, можно просто call_user_func_array
        4) Echo хз, видать человек тупняк, хотя и не видать - человек написавший это тупой
        3) Та же причина что и в 4
        2) Название норм, создаёт экзепляр, вот и называется соответсвенно
        1) А по какой причине оно должно было быть static?
        Ответить
        • 1) Функция не использует состояние класса -> static. Или вообще простой функцией (класс тут полезен только как namespace)
          2) Экземпляр, а не класс. Должно быть вроде CreateInstance
          5) Тут new, а не вызов функции. call_user_func_array не сработает.
          6) Это не просто создание произвольного класса (что разумно во многих местах), а с произвольными параметрами. Если это выбор конкретной реализации по каким-то параметрам (типа контроллера по url) - то зачем произвольная сигнатура; если вызов callback'а - то почему класс, а не callable; если это сериализация произвольных объектов - то начерта это в календаре.
          Ответить
    • И главный вопрос. Почему 10 параметров?
      Ответить
    • Где-то я это уже видел...
      Ответить
      • Да было-было в разделе жаба, вернее груви. И так было до 42.
        Как и сказал @wvxvw я сначала подумал на жабу и только потом доллары разглядел.
        Ответить
      • Я думаю, и это тоже заразно.
        Реализуется уже который раз подряд. Скоро за такое пора будет выкидывать на мороз.
        Ответить
    • Непонятно одно - зачем городить аццкие конструкции, если конструктор может принять в качестве входного параметра массив, куда и забить все что нужно, и создавать экземпляр класса одной строчкой, а не аццким свитчем.
      Ответить
    • Они использовали этот класс следующим образом:
      if (class_exists("ReflectionClass") ){
      $reflectionObj = new ReflectionClass($helper);
      if (method_exists($reflectionObj,"newInstan ceArgs")){
      $var = $reflectionObj->newInstanceArgs($arguments);
      }
      else {
      $var = $this->CreateClass($helper,$arguments);
      }
      }
      else {
      $var = $this->CreateClass($helper,$arguments);
      }
      Видимо, по причине обратной совместимости со старыми версиями PHP или случаев, когда рефлексия недоступна хз почему, они и навернули сие чудо.
      Ответить
    • что за ненависть к new?
      Ответить
      • Олдфаги-ньюфобы.
        Ответить
      • Капитан Крестоблядь (я не про себя) считает, что лучше выделять объект на стеке, это более кэш-френдли, это не дёргает кучу, это не требует ручного вызова удаления объекта из кучи.
        Ответить
    • Это лютый Боян. Был на говнокоде уже на всех языках почти.
      Ответить
      • http://svn.codehaus.org/groovy/trunk/groovy/groovy-core/src/main/org/codehaus/groovy/runtime/ArrayUtil.java
        Вне конкуренции.
        Ответить
        • Замечательный код... можно скроллить его бесконечно...
          Ответить
        • Мать моя женщина
          Ответить
        • Ой-ой-ой. Это просто легендарный код. Ранее я о нем только слышал из рассказов Java любителей. Впервые увидел сие вживую. Приведенный в этом посте код и рядом не стоял. Спасибо за ссылку.
          Ответить
        • До 249 только. А чё так?
          Ответить
        • Видимо, это как раз тот случай, когда говно не говно, а ценное удобрение навоз.
          Ответить
        • Двести бутылок пива стояло на столе.
          Ответить
    • Стоит заметить, что не такой уж это и говнокод. Все это безобразие можно заменить вызовом call_user_func_array, но есть мнение, что это сильно медленней, чем вот так, в лоб. Возможно разработчики фреймфорка споткнулись на производительности.
      Ответить

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