俺カスタムなイテレータ (3)
2008/09/01 21:04 - デザインパターン
人は二足歩行をすることで大脳を発達させ、知恵を得ました。 そして文明を発達させ、万物の霊長の地位に登りつめました。 しかし二足歩行という行為は、知恵を人間に与える一方、腰痛の原因ともなり、人は宿業として苦痛に悩まされることにもなったということです。
人は何か利益を得るために、その分何かしらの代償を払わなければならないというのは、世の理やもしれませぬ。
そんなのはガセ、という意見もありますが、今回のテーマのメタファーとしてジャストフィットなので、枕としました。
クラスの設計 続き
前回、配列をふたつ用意することで、正順、逆順、ランダムでのアクセスが可能なイテレーターが作れるようになるという結論に達しました。
しかしその便利さの代償として、普通のイテレータでは発生しない使用上の制限が発生することになるのです。
それは、コレクションが保持する配列(以下「対象配列」)とアクセス用インデックスを格納した配列(以下「アクセス配列」)の同期を取らなければいけない、ということから発生します。
この対処についても幾つかのアプローチが考えられますが、私は以下の仕様を選択することとします。
- イテレータ生成は、コレクションへのオブジェクト格納の完了を前提とする
- イテレータ生成時に、アクセス配列を生成し、アクセス配列の内容は固定する
- イテレータ生成後、コレクションの配列へのオブジェクト格納を禁止する
つまりイテレータ生成と同時にコレクションにロックをかけるということですね。
別にそんな不便なことせんでも、コレクション配列への追加と同時にアクセス配列も更新すればいいじゃん、という考え方もあるでしょうが、上記の仕様は、わりと大きな制限を伴うとは言え、ワタクシ的には、コレクションとイテレータの連動とか、各クラスのコードのスッキリさ、とかいろいろ考えると、こういう仕様がベストっぽいので、このアルゴリズムを採用することとします。
今後、不便を感じるようになったらそのときはまた改造するってことで。
そんなワケでできたコードがコレ。
- iterator.as (3.50KB 追記:2008/09/02 ファイルを一部差し替えました)
続く。
シリーズ