Enum best practise in ActionScript 3.0
这篇小文指在共享作者在ActionScript 3中设计数值枚举类型的最佳实践,原理是利用二进制的数值记数特征,在其它高级语言中亦易于实现,重在机理。
场景:在一个类库的某一个弹出窗口组件中,底部可能出现4个按纽:Yes,No,Ok,Cancel。这4个可能同时出现,也可能仅出现其中的任何n(0<n<4)个,这个策略由用户决定。
一,最简单的方法是最设计为字符串:
public static const YES :String = "yes"; public static const NO :String = "no"; public static const OK :String = "ok"; public static const CANCEL :String = "cancel";
当用户使用这个组件传递参数时,可以传递一个Array(Element of String)数组给这个组件,组件在运行时判断包含哪些按纽标记,然后依次创建添加。在这种设计中,YES与NO等枚举变量的字符串值是没有具体意义的。
假设传进来的是flags字符串数组,可以这样查找指定标记:
if (flags.indexOf(YES) > -1)…
二,有另外一种更为节省内存、更为优雅的设计方法。我们可以把它们定义为:
public static const YES :uint = 1 << 0; public static const NO :uint = 1 << 1; public static const OK :uint = 1 << 2; public static const CANCEL :uint = 1 << 3;
Number总是比String占用用户更少的内存。左位移符后面的数字递增,保证这些枚举值是唯一的,并且保证它们之间任意的或(|)操作的值也是唯一的,这是由二进制本身的特性决定的。
当用户使用这个组件传递参数时,可以使用或操作符号传递一个uint数值。在组件内部,可以使用并(&)操作符号判断是否含有指定标记。假设传进来的参数变量为flags,类型为uint,判断是否含有YES标记的示例代码如下:
if (flags & YES)…
三,如果不使用左位移符号,也可以使用Math.pow。同样的效果,不同的代码定义如下:
public static const YES :uint = Math.pow(2, 0); public static const NO :uint = Math.pow(2, 1); public static const OK :uint = Math.pow(2, 2); public static const CANCEL :uint = Math.pow(2, 3);
四,在Adobe Flex SDK内部,在Alert组件中使用了类似的设计方法。不同的是,Adobe SDK使用的是八进制,相关代码如下:
public static const YES:uint = 0x0001; public static const NO:uint = 0x0002; public static const OK:uint = 0x0004; public static const CANCEL:uint= 0x0008;
这些数据虽然是八进制,但不是1234,而是1248,明显这是故意的。在AlertForm中,可以找到如下类似代码:
if (buttonFlags & Alert.OK) { label = String(Alert.okLabel); button = createButton(label, "OK"); if (defaultButtonFlag == Alert.OK) defaultButton = button; }
这段代码用意不言自明。
2010/2/18 sban Beijing
本站所有文章均为sban原创,帖子均以现状提供且未授与任何权利。未经作者授权,不得以任何形式引用、转载或出版。