AS3를 사용하면서 c#의 LINQ 같은 object query 기능이 있으면 좋겠다고 생각했는데, 생각해보니 AS3에도 E4X라는 좋은 기능이 있어서 object 를 xml로 serialize만 하면 E4X를 사용할 수 있는거였습니다.
xml serialize야 Flex에 이미 있는 기능이지만, 약간 관점을 달리해서 마치 Object를 E4X로 사용할 수 있듯이 클래스로 만들어 용법을 정리해 보았습니다.
아래는 Array, Dictionary, Object 세 개의 collection 객체를 이용하여 특정 속성의 값을 찾는 코드를 기존방식과 E4O를 이용한 방식으로 분류해 보았습니다.
(제가 쓰는 code syntax highlighter에 as3가 없어서 임시로 javascript용으로 컨버팅했습니다..ㅎㅎ)
package
{
import ablib.core.E4O;
import flash.display.Sprite;
import flash.utils.Dictionary;
/**
* ...
* @author giman
*/
[SWF (width="100", height="100")]
public class E4O_Example extends Sprite
{
public function E4O_Example()
{
var result:String;
var arList:Array = new Array();
arList[0] = { name1 : "name11", name2 : "name22" };
arList[1] = { name1 : "name33", name2 : "name44" };
arList[2] = { name1 : "name55", name2 : "name66" };
var dicList:Dictionary = new Dictionary();
dicList["a"] = { name1 : "name11", name2 : "name22" };
dicList["b"] = { name1 : "name33", name2 : "name44" };
dicList["c"] = { name1 : "name55", name2 : "name66" };
var objList:Object = new Object();
objList["a"] = { name1 : "name11", name2 : "name22" };
objList["b"] = { name1 : "name33", name2 : "name44" };
objList["c"] = { name1 : "name55", name2 : "name66" };
//-------------------- 기존방식 검색방법
// Array 검색하기
for each (var arItem:* in arList)
{
if (arItem.name2 == "name44")
{
result = arItem.name1;
break;
}
}
trace(result); //print : name33
// Dictionary 검색하기
for each (var dicItem:* in dicList)
{
if (dicItem.name2 == "name44")
{
result = dicItem.name1;
break;
}
}
trace(result); //print : name33
// Object 검색하기
for each (var objItem:* in objList)
{
if (objItem.name2 == "name44")
{
result = objItem.name1;
break;
}
}
trace(result); //print : name33
//-------------------- E4O를 이용한 검색방법
// Array 검색하기
result = E4O.toXML(arList).item.(name2 == "name44").name1;
trace(result); //print : name33
// Dictionary 검색하기
result = E4O.toXML(dicList).*.(name2 == "name44").name1;
trace(result); //print : name33
// Object 검색하기
result = E4O.toXML(objList).*.(name2 == "name44").name1;
trace(result); //print : name33
}
}
}
코드가 많이 심플해지지 않았나요? ^^
성능은 워낙 간단한 검색만 테스트해서인지 기존 검색방식과 0~1ms 정도 차이 밖에 나지 않았습니다.
아마도 검색원본 객체가 커지면 그만큼 serialize 시간이 늘어나므로 속도 및 메모리사용 효율은 떨어질 것으로 예상됩니다.
뭐 그래도 코드의 복잡도와 성능 중에서 복잡도 개선이 우선순위라면 충분히 쓸만해 보입니다. (전 그래요!!)
관련소스를 첨부했으며, 해당 소스는 Flash Develop에서 AS3 Project로 제작되었습니다.
E4O.zip