"PHP" / Говнокод #11986 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 SunnyMagadan, (Updated )

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

  • A в этом что-то есть. Назвать свой проект так, чтобы начинался с J. Потом все будут думать, что он на Яве - а там хрясь, и ПХП притаисля!
    Ответить
  • 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; если это сериализация произвольных объектов - то начерта это в календаре.
        Ответить
    • Да было-было в разделе жаба, вернее груви. И так было до 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 или случаев, когда рефлексия недоступна хз почему, они и навернули сие чудо.
    Ответить
    • Капитан Крестоблядь (я не про себя) считает, что лучше выделять объект на стеке, это более кэш-френдли, это не дёргает кучу, это не требует ручного вызова удаления объекта из кучи.
      Ответить
  • Это лютый Боян. Был на говнокоде уже на всех языках почти.
    Ответить
  • Стоит заметить, что не такой уж это и говнокод. Все это безобразие можно заменить вызовом call_user_func_array, но есть мнение, что это сильно медленней, чем вот так, в лоб. Возможно разработчики фреймфорка споткнулись на производительности.
    Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8