Ежедневные архивы: 22.01.2012

Итог аутсорсинга в Египет

Примерно полгода назад я делал на заказ Flex чат с достаточно стандартной функциональностью (заказчик из Индии, но это неважно). После релиза я по разным причинам продолжать доработки не мог и для мелких добавок проект был передан египетскому разработчику, судя по местам работы и регалиям, достаточно опытному. Недавно я продолжил работу над своим детищем и спешу поделиться с вами чудесами египто-кода. Наверное, буду первооткрывателем этого стиля программирования в мировом масштабе. Начну по степени возрастания маразма.

Неладное я заподозрил когда парень из Египта убеждал меня что надо заменить библиотеки во Flex SDK, иначе, ничего не получится. Видимо он не добрался до настроек проекта, ну да ладно.

Затем он по неизвестной мне причине отключил в проекте RSL и теперь на выходе это была здоровенная флеха под 2 мегабайта.

И вдобавок ко всему сделал свой внешний прелоадер. Может, его заломало разбираться с существующей инфраструктурой или он посчитал что так будет лучше, не знаю, но этот шаг оставил после себя кучу файлов там и сям, которые очень не хотелось добавлять в систему контроля версий.

А теперь зацените реализацию паттерна «фабрика» по-египетски. В оригинале этой функции не было вообще. Класс инстанциировался, выполнял вызов к серверу и умирал.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class DataService extends BaseService {
    private static var _instance :Array;
       
    public static function getInstance(number:String,showBusyCursor :Boolean = false, resultHandler :Function = null, faultHandler :Function = null) :DataService {
        if (_instance == null) {
            _instance = new Array();
        }
        if(_instance[number]==null)
        {
            _instance[number]=new DataService(showBusyCursor,resultHandler,faultHandler);
        }
        else
        {
            _instance[number]._resultHandler=resultHandler;
            _instance[number]._faultHandler=faultHandler;
        }
        return _instance[number];
    }
}

Теперь, внимание, использование класса:

1
2
3
4
5
6
try{
    DataService.getInstance("ffq0r4",true, function(value:Boolean):void {
        checkBox_disvideo.selected = !value;
    }).getVideo();
}
catch(e:Error){Alert.show((e.message)+"53trfg");}

«ffq0r4» это просто случайный набор букв. Ручной хеш так сказать. Также, внимания заслуживает способ отлова ошибок в коде. Это где к сообщению об ошибке добавляется тот же хенд-мейд хеш, наверное, для удобства поиска.

А ещё main обёрнут в try/catch.

Ну и самое интересное нас поджидает в коде сервера. В PHP есть переменная $_SESSION, которая хранит данные текущей сессии. Там у меня хранились некоторые данные вроде id текущей комнаты. Выглядело это примерно так:

1
$_SESSION['currentRoomId'] = 12345;

А стало выглядеть вот так:

1
$_SESSION['currentRoomId'.$clientLogin] = 12345;

т.е. к каждому ключу в этом массиве египтянин зачем-то добавляет логин пользователя. Может он не подозревает, что сессии уникальны?