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

    +166

    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
    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).

    Запостил: Александр Михалицын, 24 Июля 2010

    Комментарии (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.
        Ответить
    • и тут тоже не знают про code review
      Ответить
    • Сделайте уже $va_args, видите, как люди мучаются!
      Ответить
    • Ого как наванила!
      Ответить
    • >>throw new Exception();
      шедевр непонимания назначения исключений. Так вот ты какое -- юзание современных технологий в пыхе
      Ответить
    • Для чего это сделано понятно, но одно не понятно, почему это сделано через прокладку между стулом и тазовой костью. При условии, что это типа форум нового поколения, видимо и говнокод в нем нового поколения.
      Ответить
      • а говнокод классический. еще и на the daily wtf проскакивало подобное, и даже на сообществе жж wtf_code
        Ответить
    • по моему наличие методов с 10 аргументами уже само по себе говно
      Ответить
    • кусок кода из стандартной библиотеки 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
      ....
      Ответить

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