article search result of 'fakeenum' : 1

  1. 2011.10.15 [AS3 , Enum] AS3 에서 Enum Type 을 구현하자 (Fake Enum in AS3) (56)

[AS3 , Enum] AS3 에서 Enum Type 을 구현하자 (Fake Enum in AS3)


C#과 AS3 를 혼용 하여 사용하는 본인에게 AS3 에서 가장 아쉬운것중 하나는 Enum 타입이 없다는것이다.
물론 

class SomeClass{  
    static const ENUMStr : String = "ENUM_STRING";
}
이런식으로 클래스 안에서 열거 하여 사용은 가능하다. 그러나 관리 적인 측면에서 아래와 같은 경우가 발생할때 참으로 애매하다.

function insertEnumValue (_enumType : String):void
{
if(_enumType == SomeClass.ENUMStr ){ ... }
}


 위와 같은 상황에서 _enumType:String 의 값을 넣는 과정에서 함수 안의 코드가 SomeClass 에서 정확히 정의된 스트링을 받아 처리 한다면 아무런 문제가 없다. 하지만 함수의 인자 타입이 String 이다. 이것의 의미는 구지 함수 인자를 SomeClass.ENUMStr 을 안넣어도 아무런 문제가 되지 않는다 (쇠고랑 안찹니다... 경찰이 안잡아가요...)
컴파일러는 단지 일치하는 String 이 없을 뿐 , 에러를 뱉지 않지만 , 그게 더 문제다. 제3자가 이 함수를 사용한다고 하자 , 혹은 오래전에 작성했던 코드를 본인이 본다고 해보자. 아마 작성자가 SomeClass.ENUMStr 을 넣어 주리라고 기대하는것은 너무 아름다운 순정만화 같은 생각 아닌가?
(물론 본인은 예전에 함수 위에 주석으로 설명을 적어 올바른 작성을 유도 하였다. 하지만 코드 자체가 오염될 여지가 있고 제 3자 가 또 다른사람에게 코드를 넘길때 , 주석이 온전히 존재하고 있을까?)

여차 하면 오리무중이 될수 있다.

또 한가지 문제 상황이 생긴다. 바로 Event 타입 상수 이다. 보통 이벤트를 이렇게 작성한다.
class SomeEvent :Event
{
    public static const EventType : String = "SomeEvent.EventType"
    public SomeEvent (type:String, ..(생략)..){...}
}

와 같이 작성하고 ,

dispatchEvent( new SomeEvent( SomeEvent.EventType ));

처럼 이벤트를 발생시킨다.

만약 SomeEvent 에 종전과 같은 방식으로 ENUMStr 를 작성 한다고 생각해보자.

class SomeEvent :Event
{
    static const ENUMStr : String = "ENUM_STRING";
    public static const EventType : String = "SomeEvent.EventType"   
    public SomeEvent (type:String, ..(생략)..){...}
}

그리고 이벤트를 발생(dispatchEvent) 시키고 받을때(addEventListener)를 생각해 보면
아마 혼동이 팍! 올것이다.

dispatchEvent( new SomeEvent( SomeEvent.ENUMStr )); //??
dispatchEvent( new SomeEvent( SomeEvent.EventType)); //??


addEventListener(SomeEvent.ENUMStr , func ) //??
addEventListener(SomeEvent.EventType, func ) //??



참.. 생각하기도 싫은 상황이다. 이것을 위해 이벤트의 코드 힌트를 보고 인간적으로 이해를 해야 하는가?
예를 들어 "EventType 이라고 적어 놓았으니 , Event 상수겠지..." 이런 생각은 물론 거의 대부분 맞다. 하지만
어디까지나 예상일뿐 명확하지는 않다.


그래서 이러한 상황을 타계 하고자 다른 언어에서 존재하는 가벼운 Enum 타입이 필요 하다.


원문 : http://scottbilas.com/blog/faking-enums-in-as3/
 
package jjongun.devUtil.enum
{
    import flash.utils.describeType;

    public class EnumUtil
    {
        public static function InitEnumConstants(inType : *):void
        {
            var type : XML = describeType(inType);
            
            for each(var constant : XML in type.constant)
            {
                inType[constant.@name].text = constant.@name;
            }
        }
    }
}


추상 클래스가 필요하다.
 
package jjongun.devUtil.enum
{
    public class AbsEnum
    {
        public var text :String;
        public function AbsEnum(ChildClass :Class)
        {
            EnumUtil.InitEnumConstants(ChildClass);
        }
    }
}



실제 ENUM을 구현하는 클래스 이다. 여기서 바로 ENUM을 선언하여 사용한다.
 
package
{
    import jjongun.devUtil.enum.AbsEnum;

    public class EnumTEST extends AbsEnum
    {
        public static const INIT : EnumTEST = new EnumTEST();
        public static const ENUMTEST : EnumTEST = new EnumTEST();
        
        public function EnumTEST()
        {
            super(EnumTEST);
        }
    }
}


실제 사용이다. 따로 new 키워드를 사용할 필요 없이 여느 enum 과 같은 형태로 사용이 가능하다.
 
        public function TESTCLASS()
        {
                        
            testEnum(EnumTEST.ENUMTEST);
        }
        public function testEnum(type :EnumTEST):void
        {
            if(type == EnumTEST.ENUMTEST)
            {
                trace("ok!" , type);
            }
        }


Yamecoder 야매코더_
AS3 2011.10.15 23:37
Powerd by Tistory, designed by criuce
rss