Ruby でデザインパターン

休日(こどもの日)。晴。
朝早く、妹一家帰る。何だか幸福のおすそ分けをしてもらった感じ。上の甥っ子は中2で、いまとても扱いにくい年頃なのだそうだが、僕とはふつうに将来の話や勉強の話をしていて妹夫婦は感謝していたと後で聞く。僕は別にふつうにしゃべっていただけなのだが。しかし、親っていうのはじつに大変だな。よくやっていると感心する。独身のおっさんなどはまったく気楽なものだ。僕は自分が大人の気がしない。
音楽を聴く。■バッハ:カンタータ第34番「おお永遠の火、おお愛の源よ」(カール・リヒター参照)。バッハのカンタータのよさがようやくわかってきたようだ。もちろん前から好きだったのだが、とても心に沁みる。僕はキリスト教にさほどの同情はないけれど、キリスト教が立派なものをたくさん生み出してきたことに心から感謝したいと思う。

Rubyによるデザインパターン』を読み返している。OOPをきちんと使うにはデザインパターンの習得が欠かせない。本書を以前読んだときはよくわからないところが多かったが、今度はだいたいわかる。そうしてみると、デザインパターンを学ぶというのは、驚きがあって楽しい。デザインパターンは抽象的で、数学と似たところがあるような気がする。まだもちろんデザインパターンを自由自在に使えるわけではないが、そうならないといけないのだよね。そういえばこんなサイトがあったな。これも読み返してみよう。
 上サイトの外部イテレータの説明だけれど、これも Ruby の Enumerator を使って下のように書ける。BlogIterator クラスは必要ない。

class Article
  def initialize(title)
    @title = title
  end  
  attr_reader :title
end

class Blog
  def initialize
    @articles = []
  end

  def add_article(article)
    @articles << article
  end
  
  def iterator
    @articles.to_enum
  end
end

blog = Blog.new
blog.add_article(Article.new("デザインパターン1"))
blog.add_article(Article.new("デザインパターン2"))
blog.add_article(Article.new("デザインパターン3"))
blog.add_article(Article.new("デザインパターン4"))

enum = blog.iterator
loop do
  article = enum.next
  puts article.title
end

Enumerator#next は終わりに達すると StopIteration 例外を発生し、 Kernel.#loop は StopIteration を捕捉するので、while 文を書く必要はない。Ruby の美しい実装だと思う。
 また、最後の 5行は、内部イテレータを使えば次の 1行と同等である。

blog.iterator.each {|article| puts article.title}


How to create simple calculator in Ruby Shoes
Green Shoes を使った、簡単な電卓を作るサイト。勉強になる。