まつもと ゆきひろです

In message "[ruby-ext:01612] Re: require 'dir/...'?"
    on 01/03/02, "Dai.K." <MAP2303 / mapletown.net> writes:

|> ええ。でも、その大きな違いは実は「気分」だとご自分でも認めて
|> いらっしゃったような。
|
|  心配は気分という言葉で括れるでしょうが、これは無視できない心配です。
|  故に気分にすぎないとは片づけられないわけです。

えーと、心配はおおいにしていただいて結構なんですが(名前空間
は有限の資源ですし)、ただディレクトリfooとfoo.rbを別々にする
心配をするんじゃなくてもっと高いレベルで心配するべきではない
かと思います。fooという名前そのものが衝突しない方法とか。

|> 私は「fooディレクトリが提供する機能(fooライブラリ)のエントリ
|> ポイントを用意するならfoo.rb」と言ってるだけで、逆(foo.rbは
|> fooディレクトリのエントリポイントでなければならない)ではない
|> ので。
|
|  え? 
|  これって相当分かりにくくないですか?
|  コードを書いた以外の人が見たら、普通は逆(foo.rbはfooディレクトリのエントリ
|ポイント)を想像するかと。

そうですか? 提供するのは構造でなく機能なんで(正直言うとユー
ザとしては構造には関心がない)、foo.rbをrequireするときにfoo
ディレクトリがあるかどうかなんてどうでもいいことだと思いませ
んか?

|> 名前空間の汚染という意味ではfooというディレクトリを使った時
|> 点で、ライブラリ空間のfooという名前は予約されたと認識してま
|> す。fooとfoo.rbがまったく別の意味で使われると相当困るんで。
|> 
|> ですから、「foo.rbを使わない」というのはやはり気分あるいは自
|> 己満足に過ぎないと思います。気分を否定するつもりはないですが、
|> 気分の維持を積極的に支援するつもりもないです。
|
|  つまりその予約は cgi.rb と cgi/session のような場合まで妨げるものでは
|ないわけですよね。僕はそれも避けたいので、つまり a. を使う場合、 foo.rb は
|foo/ のエントリポイントですと説明したいわけで、ちょっときついですね。

予約の意味によると思います。私が言った「予約」はその名前の意
味の予約というニュアンスです。

たとえばcgiをCommon Gateway Interfaceのために使いますという
意味では予約されていますよね。ここでcgi/fooをcgiをなにか別の
CGI(たとえばComputer Generated Image)の意味で使われたりする
と良くないんで、Common Gateway Interface以外では使わないでねっ
て意味では予約されていると思います。

ですから、

|  つまりその予約は cgi.rb と cgi/session のような場合まで妨げるものでは
|ないわけですよね。

というものを妨げていません。

|僕はそれも避けたいので、つまり a. を使う場合、 foo.rb は
|foo/ のエントリポイントですと説明したいわけで、ちょっときついですね。

つまり、私が前のメールで述べた「逆」を導入したいんですね。

なぜ?
その方が気分が良いから?
統一されたルールがあるのが安心するから?

|> fooという機能を提供したいのであれば、そのrequireする名前も
|> fooであるべきだし(つまり、*現状では*foo.rbを用意するしかない)、
|> fooという分類のbarという機能を提供したいのであれば、foo/bar 
|> であるべきでしょう。ここに迷いはないです。
|
|  foo/bar なら bar で決まりなんですが、デフォルトは悩みます。
|  というか foo/foo.rb である*べき*とまで言える理由がよく分からないです。

foo/foo.rbじゃなくてfoo.rbです。実装がディレクトリに格納され
ているかどうかには全然関心が無いんです。もちろん分類のための
ディレクトリの存在は肯定しますので、その場合には分類後のもう
一段下の話だと考えてください。net/ftpがnet/ftp.rbで実現され
ていようが、複数ファイルに分割されてnet/ftp/*で実現されてい
ようが関係なく、net/ftpという機能を提供してくれるんなら
require "net/ftp" としたいわけです。

要するに複数ファイルをまとめるためのサブディレクトリの存在に
は関心がないのでrequireにもそのことが現れて欲しくないわけで
す。一方、分類のためのサブディレクトリは分類そのものに意味が
あるので、requireに現れるのが当然なわけです。

で、サブディレクトリを分類のためにも、複数ファイルをまとめる
ためにも使っていますというケースは当然あると思いますが、その
場合には、分類する対象が当然あるわけなんで、その分類に従って
エントリポイントに意味のある名前が決まるでしょう。

ところで、b案というのはサブディレクトリを作った場合の、(デフォ
ルトの)エントリポイントの名前を決めましょう、という意味だと
思うんですが、「決める」ということは、その決めた名前にはエン
トリポイントであるということ以外には意味がないわけです(だっ
てどんなライブラリでも使えると言うんですから)。そんな意味の
ないエントリポイントを必要とするということは、そのサブディレ
クトリは複数ファイルを分類するためのサブディレクトリであると
いう可能性が非常に高いと思います。それだったら、

  require "foo/エントリポイント"

よりも、たとえ「エントリポイント」にどのような名前が入るにし
ても、
  
  require "foo"

の方が適切でしょう、というのが私の主張です。

サブディレクトリの外にあるかどうかは、現在の実装の都合ですか
ら、もし「あるライブラリを構成するファイル群はエントリポイン
トも含めてサブディレクトリに格納されたほうが良い」という合意
ができれば、require "foo" で "foo/エントリポイント.rb" をロー
ドするような実装にする可能性はあると思います。

現時点ではまったく必要性を感じてませんが。

|foo/ というディレクトリ名(すなわちライブラリ名)でもうすでに分かりますから、む
|しろ「デフォルト環境です」という意味の名前がふさわしいかと。
|  「foo ライブラリの foo 環境」というよりも「foo ライブラリのデフォルト環境」
|と言った方が分かりやすいでしょう。

「デフォルト」で他に適切な名前がない(かつ、fooの機能全体では
なく、使い方の一例でしかない)のならfoo/default.rbでしょう。
でも、大概はもっと適切な名前がありそうなものですが。

|> |  僕は require.rb 使ってるわけですが、ちと不満なり。
|
|  foo/require.rb の意図することは、foo のデフォルトとして
|require 'foo/require.rb' と require されるべきファイルであるということです。

「requireされるべきファイル」ってなんだかfooの機能とはまった
く関係ないレベルの使い方とか役割みたいなもんですよね。私とし
ては、そのファイルをrequireすることによってなにができるよう
になるかという名前の付け方をしたいんですよ。

|  実装の都合というのは、require の書かれているファイルという意味ですよね。
|でなくて require の対象となるファイル。

私が実装の都合といったのは「このライブラリはfooディレクトリ
中の複数ファイルから構成されててね、その中でrequireの対象に
なるのはfoo/requireなんだ」という事実そのものです。

fooという機能を提供したければ foo、 fooという分類のbarという
機能が提供したければ foo/bar、それで十分だと思います。

|  require 'foo/foo'
|or
|  require 'foo/default'

私はfoo/fooもあんまり賛成しません。

foo/fooがありえるのはfooという分類に属するいろんな使い方や機
能の中で、やはりfoo という名前がもっとも適切なものがある場合
だけだと思います。

|default のが分かりやすいし、後者は美しくないにせよ前者はちょっと醜い。
|
|# standard.rb とかかなぁ?

ある決めた名前をユーザに見せようという段階で、すでになんだか
違うものを感じてます。

                                まつもと ゆきひろ /:|)