高橋征義です。

ああ、そうか、あおきさんの感じてる「矛盾」がわかったかも。
# って、違ったりして(汗;
ひょっとして私の書き方の問題かな? だったら申し訳ない(_o_)

えーと、前田さんが[ruby-ext:01621]に書いた通りで、別に
require 'foo' して読み込んだものは Foo.hoge() という形で使える
はず、というわけではないのです。モジュールでもいいし、直接使う
のがその下のクラスであっても構いません。何かしらのまとまったもの
に対する名前が Foo で、それを使うということが require 'foo' する
こと、というつもりです。

それは、Foo::Constants という定数をまとめたモジュールに対して、
require 'foo/constants' しておきながら、実際に使うのは
Foo::Constants::Hoge とかの定数だけ、というのと同じようなこと
ではないかと。

Minero Aoki <aamine / dp.u-netsurf.ne.jp>さん:
> なんで foo/bar(Foo::Bar) と
> foo/baz(Foo::Baz) をまとめるのが foo.rb になるのが同様に自然と言え
> るのかわかんない、ということです。

これはまさに Baz と Bar を「Foo」でまとめてるから、そして「Foo以下の
ものは一個のまとまった形で提供されるべき」、と作者が考えているから
です。
そのことは、「Foo」というモジュールに対して、なんらかのまとまりを
感じていることに他なりません。そのまとまりをユーザに対して提供する
のに最適な形(名前)が、 require 'foo' じゃないか、ということです。

あー、でも、

 * 普通は Foo::BarとFoo::Baz を使う
 * でも、Foo::Hoge とかを含めた全部を提供する場合もある

ということはありますよね。その場合、前者は、
   require 'foo'
後者は、
   require 'foo'
   require 'foo/hoge'
ということになるかと思います。そしてさらに、そういう非標準的な
ものを全部読み込むことに意味がある場合もあるかもしれません。その
場合には、
   require 'foo/all'
的な使い方はあるかもしれません。いや、それでも、標準的なものは
別にして、非標準的なものを一つにまとめる名前をつくって
   require 'foo'
   require 'foo/bar'
にするべき、と感じるかも。この辺になるとちょっと怪しいです(^^;;;
# とにかく「all」という名前はいまいちっぽい。

> tmail.rb で
> 提供したいのは ::TMail じゃなくて ::TMail::* です。それを tmail.rb で
> 提供してしまうのは高橋さんの論理 (ディレクトリ構造とクラス構造が
> 対応するのがシンプルだよね) にてらしたらむしろ矛盾するでしょうと。

上に書いた通り、もし TMail というまとまりで提供したい標準的な
ものが::TMail::* でない場合、tmail.rb で ::TMail::* をむりやり
提供するのはおかしいかもしれません。でも、TMailの場合はそうでは
ないんですよね?

> てゆーか、最初はファイル名とクラス名は関係なかったはずなんですよね
> [ruby-list:15293]

そうですね。そういう意味ではこじつけっぽいかも。

それと、私の考えは「いかなるときでもクラス構造はディレクトリ構造と
一対一対応していなければイケナイ」というほどの強い主張ではないです。
そういう意味では細部には矛盾が出るかもしれませんが、とりあえず
今の話の流れくらいでは自分の中ではすっきりと解決できてると思って
ます。

高橋征義 (TAKAHASHI Masayoshi)       Email:maki / inac.co.jp