“通用”枚举类型是一种不好的做法吗?

3

我有一个涉及"BlockType"枚举的图形程序。根据不同的状态,它可能是木头、石头、草等多种材料之一。

起初,每种可能性都需要进行纹理操作,但由于进行了一些重构,该枚举现在只用作整数,并且不再需要用于switch语句。也就是说:

BlockType someFoo = someObj.blockType;

Texture usedTexture = textureLookupArray[(int) someFoo];

但是作为其副作用,枚举字符串完全是冗余的!即使块类型5被定义为“地毯”,“砾石”或“JQuery”,我也可以将“Stone”纹理放在位置5上!

我的第一个想法是简单地重写BlockType以定义“Material1、Material2等”,而不是硬编码(可能会发生冲突!)的值,但这实际上有用吗?

是否有我忽略的保持BlockType作为枚举的好处,还是应该将其切换到常规Int以减少混乱?


1
如果它们反映了实际值,那么它们对于可读性是有用的,否则我认为保留它们没有意义。 - Silvermind
1
转换为魔数会如何减少混淆?将您的查找数组转换为以枚举值为键的字典,并保留所有枚举好处!;) - Mathieu Guindon
1个回答

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)的属性,因此我无法更改。另一方面,我可以轻松地重构代码的其他部分,以从字典中获取适当的索引,而不是使用枚举的整数值!应该很完美,谢谢! - Raven Dreamer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接