CoffeeScript によるデザインパターン(Iterator)
『Rubyによるデザインパターン』をCoffeeScriptで書く試み。
目次
外部イテレータ
今回は工夫の余地があまり無さそうだけど、とりあえず原書通りに ArrayIterator クラスを作ってみる。
var array = ["red", "green", "blue"]; var i = new ArrayIterator(array); while (i.hasNext()) console.log("item: " + i.nextItem()); // 「item: red」 // 「item: green」 // 「item: blue」
内部イテレータ
CoffeeScript の for を使って表現する。
a = [10, 20, 30] console.log "The element is #{element}" for element in a
「The element is 10」「The element is 20」「The element is 30」が順に表示される。
なお、前回の CompositeパターンでArray を継承した composite3.coffee を作成したが、
あの場合の CompositeTask でも上記の for が使用できる。
task = new MakeBatterTask() console.log "Sub task: #{subTask.constructor.name}" for subTask in task
「Sub task: AddDryIngredientsTask」「Sub task: MixTask」が順に表示される。
複数のイテレータを同時に扱う
何だか収まりが悪い気がするが、こちらを今回の完成形としよう。
var array1 = [1,3,5,7,9]; var array2 = [2,6,10]; console.log(merge(array1, array2)); // [1, 2, 3, 5, 6, 7, 9, 10]
specs2で単体テスト
merge メソッドはイテレータの本来の目的ではないが、ついでにテスト。