デザパタを一人でこっそり振り返ろう #1 (Iterator)
2011.02.27 注記:umejava さんのコメントにより、一部間違った記述を訂正。
最初は読書会に参加して勉強させて貰うつもりだったんですが、本来の趣旨であるところの:
GoF を基礎から丁寧に振り返りましょう
というテーマを無視してヨタ話に突っ走り、それはそれで非常に面白かったんだけど、むしろ基礎を押さえたい人を置いてけぼりにしてしまったことにいたく反省をして、読書会は抜けたわけで。
でも、そのためにせっかく買った
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (400件) を見る
そしたら注文してた、
Design Patterns Smalltalk Companion, The (Software Patterns Series)
- 作者: Sherman Brown, Kyle Woolf, Bobby Alpert
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 1998/02/10
- メディア: ペーパーバック
- 購入: 1人 クリック: 23回
- この商品を含むブログ (9件) を見る
つーことで、以下さらさらっと舐めたいと思います。
以下結城先生の本は JDP、Smalltalk のヤツは DPSC と略記します。
Iterator パターン
d:id:naruoga:20110210:1297363662 で振り返った内容なわけですが、DPSC の見解は Ruby などの動的言語でも通用するんじゃないかな。
内部イテレータ
「ある固まり (Aggregator) に対して、その要素すべてにある処理を順に実行していく」という、その「要素すべてに」順次実行していく、という制御そのものを内部に隠蔽してしまうのが内部イテレータ。
外部イテレータ
内部イテレータの方が記述がコンパクトだけど、処理を外部から制御したいときだってある。そういう場合は「進む」「戻る」という概念を外に出して、積極的に制御を外部に取り出してやる。これが外部イテレータ。
- Smalltalk の場合には
Collection のサブクラスであるStream が外部イテレータとして使える。 - Smalltalk では String は Character の Stream なので、レキサとか書くのに便利だよ。
- テキストエディタのアンドゥ・リドゥを実現したいときなんかにも Stream を使うといいよ。
ここまで丁寧に説明して貰うと、「内部イテレータだけでいくない?」という疑問がちょっと解消されるよね。
今 DPSC の Adaptor パターンを読み中なんだけど、こっちもすっげぇ面白い。早く追いつきたいよう。
でも今日はこれでおしまい!
ごめんなさい。
*1:空間効率いかにも悪そうだけど、オブジェクトを Copy On Write しとけば済む話なのかな。←2011.02.17 追記:Shallow Copyなのでそれほど重くないそうです。やっぱそうですよね。