10

私は最近、AS3 でクリーンなコーディング手法を実装しようと試みています。これらの 1 つは、包含オブジェクトから配列への参照を渡さないことです。ポイントは、私が 1 つのクラスからの追加と削除を制御し、アレイの他のすべてのユーザーが読み取り専用バージョンを受け取ることです。

現時点では、読み取り専用バージョンは私が作成したArrayIteratorクラスであり、典型的なIteratorインターフェイス (hasNext、getNext) を実装しています。また、Proxyを拡張するので、Array と同じようにfor eachループで使用できます。

だから私の質問は、これは多くの言語の基本的な機能であってはならないということですか? コレクションのビューのみを読み取るために参照を渡す機能はありますか?

また、AS3 のコレクションの型安全性がVectorクラスの形で改善されたので、VectorIteratorで Vector をラップすると、不変性のために入力が失われます。AS3 で不変性とタイピングという 2 つの欲求を実装する方法はありますか?

4

5 に答える 5

4

Iteratorパターンを使用することは、変更されないことを保証しながら、システム全体にコレクションを渡すために現在AS3で使用されている最良の方法のようです。

私が使用するIIteratorインターフェースはJavaIteratorをモデルにしていますがremove()メソッドは実装していません。これは、ユーザーが配列要素を削除できるため、Javaコミュニティの多くの人が設計ミスと見なしているためです。以下は私のIIteratorの実装です。

 public interface IIterator
 {
     function get hasNext():Boolean
     function next():*
 }

これは、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)
}

唯一の問題は...ユーザーがIIteratorインターフェースを見て、for-eachループを使用してコレクションを反復処理できることを知る方法がないことです。これを確認するには、ArrayIteratorの実装を確認する必要があります。

于 2009-03-05T11:29:35.440 に答える
0

これを達成するために私が行うことは、リストを維持するクラスに、 を介してゲッターでそのリストのコピーのみを返すようにすることslice()です。例として、私のゲーム エンジンには、追加されたSceneすべての のリストを維持するクラスがあります。Beingsそのリストは、次のようにコピーとして公開されます。

public function get beings():Vector.<Being>
{
    return _beings.slice();
}

(古いスレッドを復活させて申し訳ありません。ブライアンの回答がカバーするものを正確に実装する方法を探しているときにこれに出くわし、この問題に2セントを投入すると思いました)。

于 2013-12-18T03:14:08.640 に答える
0

AS3 用の不変コレクション クラスの小さなライブラリを作成しました。これには、型付き順序付きリストが含まれます。これは、ニーズを満たすように思えます。詳細については、このブログ投稿を参照してください。

于 2010-04-23T14:54:42.173 に答える
0

そのようなパターンをライブラリとして実装できるという事実は、言語自体に機能を追加することに対する議論であると主張する人もいます (たとえば、C++ 言語の設計者は通常、そう言います)。

于 2009-03-01T13:52:22.977 に答える
0

プロキシ オブジェクトを介して必要な不変性がありますか? VectorIterator コンストラクターに必須の Class パラメーターを指定できることに注意してください。確かに、これは現時点では設計者にとって使いやすいものではありませんが、将来的に改善されることを願っています.

于 2009-03-01T14:22:51.343 に答える