- 1
- 2
- 3
- 4
- 5
- 6
var topItem:Object;
var rowNum:int;
var rowCount:int;
...
else if (!topItem && !rowNum == rowCount)
...
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
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)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();
[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;
Делаю код ревью и рефакторинг в одном старом коде, вот на что нарвался и выпал в даун )
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, и компилятор не умеет делать оптимизации для таких случаев.
var data_xml: XML = <data>{ new XML('<!' + '[CDATA[' + remote_data + ']]' + '>') }</data>
Примерно вот так в MXML предлагается запихивать данные внутрь CDATA. Новый объект XML чтобы обойти баг во флексе, а XSS подобное разбиение строк, чтобы Flex Builder не подумал, что ]]> закрывает CDATA вокруг Script
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'ов :)
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;
*/
Коллега бьется головой в монитор - обнаружил в исходниках чужой флешки.
Стопицот, стопицот, это много или мало...
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() чтобы узнать индекс! Ха-ха-ха..
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)
//-------------------РИСОВАНИЕ и МАТЕМАТИКА--------------------------------
//Рендерить сцену
_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;
//... Тут еще очень много таких кейсов
}
}
}
Давненько писал на симулятор механический, это функция апдейта всех элементов.
Что в остальном коде, догадаться несложно.