In article <878ynqgvs5.wl / tempest.nemui.org>,
  Tatsuki Sugiura <sugi / nemui.org> writes:

> 現時点でで参考になるような実装はありますでしょうか?
> # Java?

正直な所、OO な言語で、その OO な機能を直接使って、というのはあまり見
当たりませんが、例としては、Jakarta の Commons Virtual File System が
あげられます。ただ、ちょっと見た所では、API にお手軽感が足りないように
思いますが。
http://jakarta.apache.org/commons/sandbox/vfs/index.html

なお、Java 標準の java.io.File はたしかにパス名なのですが、残念なこと
に java.net.URI などと polymorphic なわけではなく、open するインスタン
スメソッドもないので、VFS とはあまり関係ないように思います。

また、よく調べていないのですが、libferris が C++ な API を持っているよ
うです。
http://witme.sourceforge.net/libferris.web/

あとは、OO な言語ではなくなりますが、Tcl の VFS は Tcl_Filesystem をク
ラスに相当する物だと考えることもできます。
http://www.tcl.tk/cgi-bin/tct/tip/17.html
http://www-106.ibm.com/developerworks/linux/library/l-sc12.html
http://www-6.ibm.com/jp/developerworks/linux/030704/j_l-sc12.html

PHP5 にもストリームというのが入るようですが、PHP の OO 機能をそのまま
使っているというわけではなく、グローバルな関数から dispatch している感
じです。
http://www.geocities.jp/rui_hirokawa/php/phpcon2003/15.html

他にも OO でない言語で書かれたものは C の gnome-vfs, AVFS, podfuk や
elisp の tramp とか、いろいろあるようです。おそらく、それらでも Tcl と
同様に、共通インターフェースの定義があり、それはクラスに対応すると考え
られるはずです。たぶん。

> File.new("url") で各スキームハンドラ固有のインスタンスを返します。
> これは path (と言うより url) だけを必ず覚えていて、インスタンス
> メソッドでその URL から導かれる実際のファイル(じゃないかもしれませんが
> とにかくデータの実体)に対して操作をすると言うスタイルです。

私だったら、スキームハンドラなんて導入せずに、単に URI::HTTP とかを使
いますが。だから、open-uri.rb は URI::HTTP#open などを提供するわけです
けど。

> ただ、パス名(URL)をそのまま String で持っているので、やはりここは直した
> 方が良さそうですね。

べつに中身が String かどうかはあまり関係ないと思います。

> すみません、イメージがいまいち掴めていません。
> この場合、パス名や URI のクラスが実際の操作を受け持つと言うことでしょうか?

1.8.0 の時点で

require 'pathname'
require 'open-uri'

def m(x)
  x.open('r') {|f| f.each_line {|line| puts line } }
end

m Pathname.new("/home/...")
m URI.parse("http://...")

というかんじで使えるわけで、必要に応じてメソッドをつけていけばほぼ十分
だと思っています。

まぁ、URI には open と read しかつけてませんから、まだあまり
polymorphic には使えなくて、適切なメソッド名を検討しつつ、もっと増やさ
ないと楽しくありませんが。
-- 
[田中 哲][たなか あきら][Tanaka Akira]