2013-09-22 3 views
3

"BlockType"열거 형이있는 그래픽 프로그램이 있습니다. 상태에 따라 우드, 스톤, 잔디 등 여러 가지 중 하나 일 수 있습니다."일반"열거 형을 사용하는 것은 나쁜 습관입니까?

원래 각 가능성에 대해 다양한 텍스처 작업이 있었지만 일부 리팩토링 덕분에 열거 형은 정수로만 사용되며 switch 문에 더 이상 필요하지 않습니다. 예 :

BlockType someFoo = someObj.blockType; 

Texture usedTexture = textureLookupArray[(int) someFoo]; 

그러나이 부작용으로 열거 형 문자열은 완전히 중복됩니다. BlockType 5가 "Carpet", "Gravel"또는 "JQuery"로 정의 되었더라도 5 위치에 "Stone"Texture를 넣을 수 있습니다!

내 첫 번째 생각은 BlockType을 "Material1, Material2, etc."을 정의하기 위해 간단히 다시 작성하는 것이었다. 하드 코딩 된 (그리고 잠재적으로 충돌하는!) 값 대신에 실제로 유용한 목적을 제공합니까?

BlockType을 열거 형으로 유지하기 위해 간과 할 수있는 이점이 있습니까? 아니면 혼란을 줄이기 위해 일반 Int로 전환해야합니까?

+1

가 실제 값을 반영하는 경우는 가독성을위한 용도로 사용됩니다 사용하려면, 그렇지 않으면 나는 그것을 유지에 어떤 점을 볼 수 없습니다. – Silvermind

+1

어떻게 마법 번호로 전환하면 혼란이 줄어 듭니까? 귀하의 * 조회 배열 * 귀하의 enum 값으로 키가 사전 및 모든 enum 선량을 유지하십시오! ;) –

답변

7

왜 사전이 훨씬 더 좋을 때 배열을 사용합니까?

private Dictionary<BlockType, Texture> _textures = 
    new Dictionary<BlockType, Texture> 
    { 
     { BlockType.Wood, new WoodTexture() }, 
     { BlockType.Metal, new MetalTexture() }, 
     //etc 
    } 

훨씬 더 우아한

var tex = _textures[someObj.blockType]; 
+1

문제는 배열이 엔진 함수 호출 (Unity3d)의 속성이므로 변경이 불가능하다는 것입니다. 반면에 enum의 int 값을 사용하는 대신 사전에서 적절한 인덱스를 얻기 위해 코드의 다른 부분을 쉽게 리팩터링 할 수 있습니다! 완벽해야한다, 고마워! –

관련 문제