1. ActionScript / Говнокод #2689

    +3.9

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    var topItem:Object;
    var rowNum:int;
    var rowCount:int;
    ...
    else if (!topItem && !rowNum == rowCount)
    ...

    Чтобы не утомлять вас догадками, во что же это превратится и в каком порядке произойдут операции: это условие выполниться только когда:
    topItem == null
    rowNum != 0
    rowCount == 0
    Как следует из названий переменных, человек, написавший это ожидал, что количество строк может быть меньше, чем порядковый номер одной из строк...
    Взято, опять же из Flex Framework mx.controls::Tree.
    Скорее всего автор имел в виду следующее:

    else if (!topItem && rowNum !== rowCount)

    Но булевые переменные, они ж такие коварные :)

    Запостил: wvxvw, 27 Февраля 2010

    Комментарии (7)
  2. ActionScript / Говнокод #2557

    +3.5

    1. 1
    2. 2
    3. 3
    4. 4
    override public function toString():String
        {
            return Object(container).toString() + "." + super.toString();
        }

    Еще одно украшение Флексового фреймворка: mx.core::Repeater.
    Для тех, кто не в курсе: toString() вызываетйса автоматически когда мы пытаемся вывести информацию об объекте в консоль. (Т.е. жизненно необходим для тестирования). Свойство container у репитера радко, но может буть null, но изза того, что флексовые разработчики не категорически никогда не кастуют ничего, то это должно было бы выкинуть исключение, но, конвертация используемая в примере (вместо каста) в силу особенностей языка вместо того чтобы просто умереть с исключением создаст новый динамический объект, врезультате получим что-то типа:
    "[Object object].имяКомпонента".
    т.е. на самом деле код должен был выглядеть примерно так:

    return (this.container ? this.container.toString() + "." : "") + super.toString();

    Запостил: wvxvw, 05 Февраля 2010

    Комментарии (5)
  3. ActionScript / Говнокод #2394

    +5.5

    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
    [1:02:57] Dmitriy Artemyev: if (s == rb.getString('pricesForm.oneAdult'))
          ((((p.getChildAt(0) as HBox).getChildAt(0) as Form).getChildAt(0) as FormItem).getChildAt(0) as NumericTextInput).value = newS;
         if (s == rb.getString('pricesForm.twoAdults'))
          ((((p.getChildAt(0) as HBox).getChildAt(0) as Form).getChildAt(1) as FormItem).getChildAt(0) as NumericTextInput).value = newS;
         if (s == rb.getString('pricesForm.extraAdultMarkup'))
          ((((p.getChildAt(0) as HBox).getChildAt(0) as Form).getChildAt(2) as FormItem).getChildAt(0) as NumericTextInput).value = newS;
         
         
         if (s == rb.getString('pricesForm.children') + model.hotelsModule.hotelTotalInfo.iChildAge1)
          ((((p.getChildAt(0) as HBox).getChildAt(1) as Form).getChildAt(0) as FormItem).getChildAt(0) as NumericTextInput).value = newS;
         if (s == rb.getString('pricesForm.children') + model.hotelsModule.hotelTotalInfo.iChildAge2)
          ((((p.getChildAt(0) as HBox).getChildAt(1) as Form).getChildAt(1) as FormItem).getChildAt(0) as NumericTextInput).value = newS;
         if (s == rb.getString('pricesForm.children') + model.hotelsModule.hotelTotalInfo.iChildAge3)
          ((((p.getChildAt(0) as HBox).getChildAt(1) as Form).getChildAt(2) as FormItem).getChildAt(0) as NumericTextInput).value = newS;

    Делаю код ревью и рефакторинг в одном старом коде, вот на что нарвался и выпал в даун )

    Запостил: dimas_art, 11 Января 2010

    Комментарии (8)
  4. ActionScript / Говнокод #2386

    +2.2

    1. 1
    2. 2
    3. 3
    4. 4
    if (flash.net.getClassByAlias("foo.bar.VO") == null){
              flash.net.registerClassAlias("foo.bar.VO", foo.bar.VO);}
          } catch (e:Error) {
              flash.net.registerClassAlias("foo.bar.VO", foo.bar.VO); }

    Так во флексовом фреймворке регистрируются алиасы для RPC классов... Нелогичность ситуации не сразу очевидна, поэтому опишу:
    При загрузке модулей может возникнуть ситуация, когда алиас уже зарегистрирован для другого класса, поэтому нужно проверить, а не был ли алиас зарегистрирован раньше. Иначе, его нужно зарегистрировать. Исторически, этой проверки сначала не было, данный код - это фикс вышеописаной проблемы. Пытаясь разобраться, что же все-таки случилось - скорее всего "писатель" не подозревал, что getClassByAlias() не может вернуть null - а выяснил он это, когда код вывалился с ошибкой, вот он не долго думая завернул это все в try-catch...
    Из мелких деталей: в рамках AS3 сравнение сложных типов с null - бессмысленная, и более того вредная операция, т.как выражение в условии всегда кастуется к Boolean, и компилятор не умеет делать оптимизации для таких случаев.

    Запостил: wvxvw, 08 Января 2010

    Комментарии (2)
  5. ActionScript / Говнокод #2130

    −0.1

    1. 1
    var data_xml: XML = <data>{ new XML('<!' + '[CDATA[' + remote_data + ']]' + '>') }</data>

    Примерно вот так в MXML предлагается запихивать данные внутрь CDATA. Новый объект XML чтобы обойти баг во флексе, а XSS подобное разбиение строк, чтобы Flex Builder не подумал, что ]]> закрывает CDATA вокруг Script

    Запостил: sudden_def, 11 Ноября 2009

    Комментарии (5)
  6. ActionScript / Говнокод #2052

    +4.5

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    if (currentPage == "3") {
    	//trace("CUUUUUUURRRRRRREEEENNNNNTTTT PPPAAAAGGGGGGGGGEEEEEE", currentPage,currentQuestionVideo);
    	ns.play(currentQuestionVideo);
    }else {
    	//trace("ПИЗДАБЛЯТЬ!")
    	var str:String = ""+subSectionsXML.DOCUMENT[currentSubPage].FILE_1;
    	ns.play(str);
    }

    Мне дали AS3-сайт для его локализации и сказали, что код документирован.
    Комментарии оказались только в виде trace'ов :)

    Запостил: mustafin, 27 Октября 2009

    Комментарии (1)
  7. ActionScript / Говнокод #2047

    +12

    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
    this.thumbHolder._x = suma;
    		
    suma = suma + parseInt(this.picHolder.attributes.w);
    if ((i==11)|| (i==12)|| (i==13)|| (i==14)|| (i==17)|| (i==18)|| (i==19)|| (i==20)|| (i==22)|| (i==23)|| (i==24)|| (i==25)|| (i==26)|| (i==28))
    {
        suma = suma + 10;
    }
    		
    /*
     if (i==2)suma=suma+99;
     if (i==5)suma=suma+121;
     if (i==8)suma=suma+155;
     if (i==13)suma=suma+200;
    */

    Коллега бьется головой в монитор - обнаружил в исходниках чужой флешки.

    Стопицот, стопицот, это много или мало...

    Запостил: stan, 26 Октября 2009

    Комментарии (7)
  8. ActionScript / Говнокод #1861

    +2.1

    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
    function getActiveRoot():int
    {
    	for(var c:int=0;c<i;c++) if(r_arr[c].isActive) return c;
    	return -1;
    }
    
    
    
    
    
    public function addEntry():void
    {
    	if(getActiveRoot()<0)
    	{
    		r_arr.push(new Roots(i,in_txt.text,""));
    		r_arr[i].addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
    		r_arr[i].addEventListener(MouseEvent.MOUSE_UP, upHandler);
    				
    		addChild(r_arr[i++]);
    	}
    	else
    	{
    	        r_arr[getActiveRoot()].w_arr.push(new Words(getActiveRoot(),r_arr[getActiveRoot()].wi,in_txt.text,""));
    		r_arr[getActiveRoot()].w_arr[r_arr[getActiveRoot()].wi].addEventListener(MouseEvent.MOUSE_DOWN, WdownHandler);
    		r_arr[getActiveRoot()].w_arr[r_arr[getActiveRoot()].wi].addEventListener(MouseEvent.MOUSE_UP, WupHandler);
    				
    		var ls:Shape=new Shape();
    		ls.graphics.lineStyle(1, 0xFF0000,0.2);
    		ls.graphics.moveTo(r_arr[getActiveRoot()].x,r_arr[getActiveRoot()].y);
    	        ls.graphics.lineTo(r_arr[getActiveRoot()].w_arr[r_arr[getActiveRoot()].wi].x,r_arr[getActiveRoot()].w_arr[r_arr[getActiveRoot()].wi].y);
    		addChildAt(ls,++wd);
    		addChildAt(r_arr[getActiveRoot()].w_arr[r_arr[getActiveRoot()].wi++],++wd);
    	}
    }

    Ой. А давайте проц погоняем! Чтоб не скучал. Отовсюду будем запускать getActiveRoot() чтобы узнать индекс! Ха-ха-ха..

    Запостил: t8apb, 17 Сентября 2009

    Комментарии (6)
  9. ActionScript / Говнокод #1860

    +2.8

    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
    function upHandler(event:MouseEvent):void 
    {
            //r_arr[event.currentTarget.index].stopDrag();
    				
    	event.currentTarget.stopDrag();
    				
            //r_arr[event.currentTarget.index].removeChildAt(2);
    
    	if((r_arr[event.currentTarget.index].x>550)||(r_arr[event.currentTarget.index].x<160)||(r_arr[event.currentTarget.index].y>400)||(r_arr[event.currentTarget.index].y<0))
    	{
    	        r_arr[event.currentTarget.index].x=546;
    		r_arr[event.currentTarget.index].y=(r_arr[event.currentTarget.index].index+1)*30;
    	}
    }

    Сама семантика малопримечательна. Вся соль в способе адресации к объекту массива r_arr при совершении события мыши прямо над этим же объектом. Методы и свойства объекта достаются через ***у по индексу из-за пазухи: r_arr[event.currentTarget.index].removeChildAt(2)
    вместо достаточного: event.currentTarget.removeChildAt(2)

    Запостил: t8apb, 17 Сентября 2009

    Комментарии (1)
  10. ActionScript / Говнокод #1720

    −2.5

    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
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    //-------------------РИСОВАНИЕ и МАТЕМАТИКА--------------------------------
    //Рендерить сцену
    _root.onEnterFrame = render;
    
    //Функция отрисовки текущего положения
    function render()
    {
    	if (enable_anim)		//Рисовать только ЕСЛИ разрешена анимация, т.е. файл загружен
    	{
    		empty.clear();		//Очистка области для рисования
    		for (obj in arr_m)	//Пройтись по всем элементам кинематической схемы
    		{
    			switch(arr_m[obj].type){
    				case "crank":  /*type="0" l="50" angle="0" s0="2" s1="1"*/
    					//Кривошип
    					//trace(arr_m[obj].type);
    					//trace(arr_m[obj].num + " " + arr_m[obj].angle);
    					empty["arr_o"+arr_m[obj].s1]._x = empty["arr_o"+arr_m[obj].s0]._x +arr_m[obj].l*Math.cos(arr_m[obj].angle*k);
    					empty["arr_o"+arr_m[obj].s1]._y = empty["arr_o"+arr_m[obj].s0]._y +arr_m[obj].l*Math.sin(arr_m[obj].angle*k);
    					
    					if (enable_dv) //------------------------Движение звена разрешено-------
    					{
    						arr_m[obj].angle += 0.3; 
    						if (arr_m[obj].angle >= 360)
    						{ 
    							arr_m[obj].angle = 0;
    						}
    					}
    						
    					//Невидимка
    					if(arr_m[obj].hidden) continue;					
    					empty.lineStyle(2,0x404040);					empty.moveTo(empty["arr_o"+arr_m[obj].s0]._x,empty["arr_o"+arr_m[obj].s0]._y);
    					empty.lineTo(empty["arr_o"+arr_m[obj].s1]._x,empty["arr_o"+arr_m[obj].s1]._y);
    				break;
    				case "1":  /*type="1" l1="100" l2="100" s0="2" s1="3" s2="4"*/
    					//шатун + коромысло
    					//trace(arr_m[obj].type);
    					
    					var x0 = empty["arr_o"+arr_m[obj].s0]._x;
    					var y0 = empty["arr_o"+arr_m[obj].s0]._y;
    					var x1 = empty["arr_o"+arr_m[obj].s1]._x;
    					var y1 = empty["arr_o"+arr_m[obj].s1]._y;
    					
    					var r = distance(x0, y0, x1, y1);
    					var a0 = Math.acos((Math.pow(arr_m[obj].l1,2) + Math.pow(r,2) - Math.pow(arr_m[obj].l2,2))/(2*arr_m[obj].l1*r));
    					var a1 = get_angle(x0, y0, x1, y1); 
    					
    					var x2 = x0 + arr_m[obj].l1 * Math.cos(a1 - a0);
    					var y2 = y0 + arr_m[obj].l1 * Math.sin(a1 - a0);
    					//trace(a1/k);
    					
    					empty["arr_o"+arr_m[obj].s2]._x = x2;
    					empty["arr_o"+arr_m[obj].s2]._y = y2;
    					
    					//Невидимка
    					if(arr_m[obj].hidden) continue;
    					
    					empty.lineStyle(2,0x404040);
    					empty.moveTo(x0,y0);
    					empty.lineTo(x2,y2);
    					empty.lineTo(x1,y1);					
    				break;
    //... Тут еще очень много таких кейсов
    		}
    	}
    }

    Давненько писал на симулятор механический, это функция апдейта всех элементов.
    Что в остальном коде, догадаться несложно.

    Запостил: Werdn, 29 Августа 2009

    Комментарии (0)