Bef*_*rem 10 collections coding-style language-design actionscript-3
我最近一直在尝试在AS3中实现一些干净的编码实践.其中之一就是不要从包含对象中放弃对Arrays的引用.关键是我控制从一个类添加和删除,并且该阵列的所有其他用户都接收只读版本.
目前只读版本是我编写的ArrayIterator类,它实现了一个典型的Iterator接口(hasNext,getNext).它还扩展了Proxy,因此它可以像Array一样用于每个循环.
所以我的问题是,这不是许多语言的基本特征吗?能够传递对集合的只读视图的引用吗?
此外,现在AS3中的集合的类型安全性得到了改进,以Vector类的形式,当我在VectorIterator中包装一个Vector时,为了不变性而丢失了输入.有没有办法在AS3中实现这两种欲望,不变性和打字?
看来,使用Iterator模式是当前 AS3 中在系统中传递集合的最佳方式,同时保证它不会被修改。
我使用的IIterator接口是基于 Java Iterator建模的,但我没有实现remove()方法,因为 Java 社区中的许多人认为这是一个设计错误,因为它允许用户删除数组元素。下面是我的IIterator实现:
public interface IIterator
{
function get hasNext():Boolean
function next():*
}
Run Code Online (Sandbox Code Playgroud)
然后通过 ArrayIterator、VectorIterator 等类来实现。
为了方便起见,我还在具体的 Iterator 类上扩展了Proxy ,并通过重写nextNameIndex()和nextValue()方法为 AS3 中的for-each循环提供支持。这意味着在使用我的IIterator时不需要更改通常使用数组的代码。
var array:Array = ["one", "two", "three"]
for each (var eachNumber:String in array)
{
trace(eachNumber)
}
var iterator:IIterator = new ArrayIterator(array)
for each (var eachNumber:String in iterator)
{
trace(eachNumber)
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是......用户无法查看IIterator接口并知道他们可以使用for-each循环来迭代集合。他们必须查看 ArrayIterator 的实现才能看到这一点。
| 归档时间: |
|
| 查看次数: |
2797 次 |
| 最近记录: |