In message <200411160143052HUKfI@hoppeta.com>,
`Shinya Kawaji <kawaji@hoppeta.com>' wrote:
> ちょっと思いついただけの話をするんですが、
> http://www.freeml.com/message/cgikit@freeml.com/0000600
> というメールを書いていて、
>
> FileHandler.add_handler が他の handler でも使えたら良いのに
>
> と思いました。
ダブルディスパッチ風味なんですかね。なんとなく。
> 4. それだったら、AbstractServlet.add_handler が用意されているか、
> add_handler周りだけモジュール化されているほうが良い。
>
> と考えました。
>
> パッチまでは用意しませんでしたが、そもそもこの考え方はいかがでしょうか?
クラスメソッドやモジュールにするよりも、
class HandlerMap
def initialize(default=nil)
@map = Hash.new(default)
end
def add_handler(suffix, handler)
@map[suffix] = handler
end
def remove_handler(suffix)
@map.delete(suffix)
end
def get_handler(path)
suffix1 = (/\.(\w+)$/ =~ path) && $1.downcase
suffix2 = (/\.(\w+)\.[\w\-]+$/ =~ path) && $1.downcase
return @map[suffix1] || @map[suffix2]
end
end
という感じのクラスにしたほうが使いやすいかもしれません。
これなら、アプリケーション全体で共有する時は定数に突っ込んで
おけばいいし、領域によって個別のマッピングを用意するのも比較
的楽そうです。
# 作った時から薄々そんな気はしていましたが、FileHandlerはちょっ
# と失敗だったみたいです;-)
--
ごとうゆうぞう