オブジェクト指向として正しいはRubyとして正しいか

例えばRubyでSingletonのクラスを作る。
Singletonモジュールをインクルードすれば作ることができる。
インスタンスを1つしか生成できないように細工されたクラスだ。
ここで一つの疑問がでてくる。
インスタンスが1つしか無いなら、そもそもそれはクラスである必要などないのではないか。


言語によってスコープを適用する仕組みが違うから、ある限定された範囲内のみに公開される情報と、外に対して公開された情報を柔軟に作ろうと思ったら、そーいったものを使うのがいいかもしれない。
オブジェクト指向的に解決する方法で、それを使えばだいたいどのオブジェクト指向言語でも同じように解決することができる。
ある言語に、そういうスコープをうまいこと解決できる仕組みが備わっていたら、必ずしもSingletonを使う必要は無い。
汎用的な解決法と、その言語に特化した解決法、ということだ。


Rubyなら、例えばモジュールを使えば似たようなことができる。
モジュールだってModuleクラスのインスタンスなんだから、自分で変数が持てるし、メソッドも定義できる。
でもそういう使い方をしようと思うと、変数にattrで外からアクセスできるようにできなかったり、メソッドの定義をself.hogeで書かないといかなかったり、クラスとはちょっと違ったものになってしまう。
Singletonよりモジュールを使うのをオススメしているわけではない。
ただ、Rubyオブジェクト指向言語なのだから、オブジェクト指向的に正しい使い方をするのが正しい、という考え方に、少し違和感があるというだけだ。
Rubyオブジェクト指向言語である前にRubyという言語なのだから、その個性をオブジェクト指向という考え方でラッピングしてしまうのはもったいない。
もちろんそうするのも間違いではないし、まったくもって自由だから、やめろとか言うつもりもない。
自分の判断で好きなように使えばいい。


オブジェクト指向が流行るまえ、構造化言語の時代には、学問的に言語を扱う人たちは、モジュール強度がどうとか、結合度がどうとか、そういうことを言っていた。
いま、そんなこと言ってる人はほとんどいない。
また別のものが流行ったとき、オブジェクト指向のある部分は残り、不必要になった部分は消えていくと考えられる。
残る部分はおそらく、クラスを定義して、インスタンスを作って、メソッドを呼んで、といった原理・仕組みの部分で、消えるのはオブジェクト指向設計技法だ。


なんだか収拾がつかなくなってきたからここまで。