不可变的集合动作脚本3

Bef*_*rem 10 collections coding-style language-design actionscript-3

我最近一直在尝试在AS3中实现一些干净的编码实践.其中之一就是不要从包含对象中放弃对Arrays的引用.关键是我控制从一个类添加和删除,并且该阵列的所有其他用户都接收只读版本.

目前只读版本是我编写的ArrayIterator类,它实现了一个典型的Iterator接口(hasNext,getNext).它还扩展了Proxy,因此它可以像Array一样用于每个循环.

所以我的问题是,这不是许多语言的基本特征吗?能够传递对集合的只读视图的引用吗?

此外,现在AS3中的集合的类型安全性得到了改进,以Vector类的形式,当我在VectorIterator中包装一个Vector时,为了不变性而丢失了输入.有没有办法在AS3中实现这两种欲望,不变性和打字?

Bef*_*rem 4

看来,使用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 的实现才能看到这一点。