2007年7月31日火曜日

EnumeratorとIterator.

 …またやってしまった orz
 週末更新が途絶え過ぎです.
 前回反省した様な事を書いておきながら、全然反省してなかった事が白日の下に orz

 と、デジャヴな反省は置いておき.
 最近Javaの勉強も全然進んでいませ…ここでも駄目すぎる事実が orz
 反省しきりです.
 27時間テレビなんて見るもんじゃありませんw

 話が逸れまくりましたので元に戻して.
 Javaの勉強が全然進んでいないと言う駄目すぎる状況にある訳ですが、会社でPHPのコードを書いている時にフと「あれ?…EnumeratorとIteratorって…何が違うんだ?」と言う疑問にブチ当たりました.
 はい、設計の勉強云々以前の問題ですね orz

 いや、これは.Netの弊害です!!
 私も被害者なんです!!! orz

 何でPHP書いててこんな事を考えたのかと言うと、会社では主に「PHP4でも動く事が前提」でコードを書いてますので(もうPHP4系のライフサイクルも終わりますが)、オブジェクト指向ライクな構造をとる場合には、かなりの割合で自力実装が必要です.
 そして、それらは独自Frameworkとして作成・実装している訳ですが、その中でCollectionに対する列挙処理として「Iterator」クラスを作成しています.
 例えば、Collectionクラス(勿論自前実装)には「追加」「クリア」「Item取得」の様な振る舞い+「getIterator」を実装して、列挙処理にIteratorを使用するイメージです.

 ※実際にはこんなにシンプルではありませんw

 んが、.NetではIteratorと言うものは「概念上」ありますが、実際にはEnumerator(IEnumerator)がカバーする仕組みになっていて、lightmaterialの頭の中では「Iterator=Enumerator」と言う図式が完全に出来上がっていました.
 でも、実際にはJavaの実装で見ると、IteratorとEnumeratorには明確な差異があり、IteratorはEnumeratorの後継にあたり、Enumeratorでは実装されていなかった「要素の削除」機能が実装されているものだ、と定義されています.

 あれ?
 何だ?
 ん?

 …結局IteratorとEnumeratorって何が違うんだよぉぉぉぉ~~!!? orz

 Javaなら「はい、そうですか」と明確で明瞭に理解可能ですが、他の言語での実装方法を見ていると、その差異が見えてきません.
 うーん…ここは深く考えずにJavaでは「Enumeratorは過去の産物で、これからはIteratorオンリーです!」と考え、.Netでは「IteratorってEnumeratorの別名でしょ?」と考えておいた方がいいのかなぁ.

 恐るべし列挙子/反復子!
 と言いますか、こんな低レベルな事書いてるPGなんて、全国探しても私くらいのものでしょう orz
 むしろ自分自身が恐ろしい今日この頃.

0 件のコメント: