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

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
switch(count($Args)) {
         case 0:
            $Result = new $ClassName; break;
         case 1:
            $Result = new $ClassName($Args[0]); break;
         case 2:
            $Result = new $ClassName($Args[0], $Args[1]); break;
         case 3:
            $Result = new $ClassName($Args[0], $Args[1], $Args[2]); break;
         case 4:
            $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3]); break;
         case 5:
            $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3], $Args[4]); break;
         case 6:
            $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5]); break;
         case 7:
            $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5], $Args[6]); break;
         case 8:
            $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5], $Args[6], $Args[7]); break;
         default:
            throw new Exception();
      }

Взято из форума Vanilla 2...

И еще в одном файле подобное library/core/class.dispatcher.php (со строки 267).

Запостил: Александр Михалицын Александр Михалицын, (Updated )

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

  • $Count = count($Args);

    if ($Count == 0) {
    $Controller->$ControllerMethod();
    } else if ($Count == 1) {
    $Controller->$ControllerMethod($Args[0]);
    } else if ($Count == 2) {
    $Controller->$ControllerMethod($Args[0], $Args[1]);
    } else if ($Count == 3) {
    $Controller->$ControllerMethod($Args[0], $Args[1], $Args[2]);
    } else if ($Count == 4) {
    $Controller->$ControllerMethod($Args[0], $Args[1], $Args[2], $Args[3]);
    } else if ($Count == 5) {
    $Controller->$ControllerMethod($Args[0], $Args[1], $Args[2], $Args[3], $Args[4]);
    } else if ($Count == 6) {
    $Controller->$ControllerMethod($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5]);
    } else if ($Count == 7) {
    $Controller->$ControllerMethod($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5], $Args[6]);
    } else if ($Count == 8) {
    $Controller->$ControllerMethod($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5], $Args[6], $Args[7]);
    } else if ($Count == 9) {
    $Controller->$ControllerMethod($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5], $Args[6], $Args[7], $Args[8]);
    } else {
    $Controller->$ControllerMethod($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5], $Args[6], $Args[7], $Args[8], $Args[9]);
    }

    Это из class.dispatcher.php.
    Ответить
    • Не, ну тут можно использовать call_user_func, а с первоначальным примером что можно сделать (за исключением варианта "поменять api")?
      Ответить
      • С первоначальным, ну если очень хочется конструировать объект передавая конструктору переменное число параметров - можно использовать паттерн "Фабрика объектов".

        class A {
        private function __construct($args) { /* тут обрабатываем массив аргументов */ }//конструктор прайвит - то есть извне объект создать не получится.
        public static function factory() {
        $args = func_get_args();
        return new A($args);
        }
        }

        $b = A::factory($a1, $a2, $a3);
        Ответить
      • [голос с задней парты]
        а что будет если ненужным параметрам присваивать null?
        Ответить
    • Вот специально для таких как автор в файле library/core/class.dispatcher.php в районе строки 267 оставили комментарий
      // call_user_func_array is too slow!!

      Понятно, это всего лишь микрооптимизация.

      Сейчас там вместо этого косяка:
      call_user_func_array(array($Controller, $ControllerMethod), $Args);


      Но подобные косяки можно встретить и вдругих местах: library/core/class.factory.php L:195
      protected function _InstantiateObject($Alias, $ClassName, $Args = NULL) {
            if(is_null($Args)) $Args = array();
            $Result = NULL;
      
            // Instantiate the object with the correct arguments.
            // This odd looking case statement is purely for speed optimization.
            switch(count($Args)) {
               case 0:
                  $Result = new $ClassName; break;
               case 1:
                  $Result = new $ClassName($Args[0]); break;
               case 2:
                  $Result = new $ClassName($Args[0], $Args[1]); break;
               case 3:
                  $Result = new $ClassName($Args[0], $Args[1], $Args[2]); break;
               case 4:
                  $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3]); break;
               case 5:
                  $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3], $Args[4]); break;
               case 6:
                  $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5]); break;
               case 7:
                  $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5], $Args[6]); break;
               case 8:
                  $Result = new $ClassName($Args[0], $Args[1], $Args[2], $Args[3], $Args[4], $Args[5], $Args[6], $Args[7]); break;
               default:
                  throw new Exception();
            }
      
            $this->_SetDependancies($Alias, $Result);
            return $Result;
         }


      И тут для специально для "исследователей" говнокода, тоже оставили комментарий:
      // This odd looking case statement is purely for speed optimization.
      Ответить
  • >>throw new Exception();
    шедевр непонимания назначения исключений. Так вот ты какое -- юзание современных технологий в пыхе
    Ответить
  • Для чего это сделано понятно, но одно не понятно, почему это сделано через прокладку между стулом и тазовой костью. При условии, что это типа форум нового поколения, видимо и говнокод в нем нового поколения.
    Ответить
    • а говнокод классический. еще и на the daily wtf проскакивало подобное, и даже на сообществе жж wtf_code
      Ответить
  • кусок кода из стандартной библиотеки haxe:
    /**
    	Creates an instance of the given class with the list of constructor arguments.
    **/
    public static function createInstance<T>( cl : Class<T>, args : Array<Dynamic> ) : T untyped {
    	#if flash9
    		return switch( args.length ) {
    		case 0: __new__(cl);
    		case 1: __new__(cl,args[0]);
    		case 2: __new__(cl,args[0],args[1]);
    		case 3: __new__(cl,args[0],args[1],args[2]);
    		case 4: __new__(cl,args[0],args[1],args[2],args[3]);
    		case 5: __new__(cl,args[0],args[1],args[2],args[3],args[4]);
    		case 6: __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5]);
    		case 7: __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
    		case 8: __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
    		case 9: __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]);
    		case 10: __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9]);
    		case 11: __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10]);
    		case 12: __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11]);
    		case 13: __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12]);
    		case 14: __new__(cl,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13]);
    		default: throw "Too many arguments";
    		}
    	#elseif flash
    		if( cl == Array ) return new Array();
    		var o = { __constructor__ : cl, __proto__ : cl.prototype };
    		cl["apply"](o,args);
    		return o;
    	#elseif neko
    ....
    Ответить

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

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

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


    8