Index: [Article Count Order] [Thread]

Date: Wed, 17 Nov 2004 03:00:14 +0900 (JST)
From: GOTOU Yuuzou <gotoyuzo@notwork.org>
Subject: [webrickja:132] Re: FileHandler.add_handler を他の handler で利用する
To: webrickja@notwork.org
Message-Id: <20041117.030014.1025204194.gotoyuzo@sawara.does.notwork.org>
In-Reply-To: <200411160143052HUKfI@hoppeta.com>
References: <200411160143052HUKfI@hoppeta.com>
X-Mail-Count: 00132

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はちょっ
# と失敗だったみたいです;-)

-- 
ごとうゆうぞう