--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008/04/26

至高のオブジェクト指向言語

オブジェクト指向についていくらか真剣に考えて、Javaこそがオブジェクト指向的には至高の美しさを持つ言語と考えるようになったので(実際そうだとは思いませんか?)、C++の参照やポインタの混在による汚さに惑わされているのだと思います。

参照が使えるときはいつでも参照を使いましょう - 神様なんて信じない僕らのために

オブジェクト指向言語という視点において、そりゃまぁ C++ よりは Java のほうが幾分かましなんだろうとは思う。俺は C++ を触った経験はほとんどないけど、話を聞く限りではオブジェクト指向がどうとかより、もっと他の部分に時間を食われ過ぎている印象を受ける。まぁそれは置いといて。

Java は Java で、"至高の" オブジェクト指向言語とは思えないなぁ。手続き型プログラミングな書き方を大いに許しているし。もちろんこれが1つの要因となって、現代の Java 人気があるんだろうけど。オブジェクト指向言語としてはどうなのかと。

もうちょっと挙げてみると、総称が腐っているところ、機能追加によって言語仕様が破綻しかけているところ、equals がオーバーライド可能であること、package は階層的構造を持つのにその辺を用いたスコープ指定がない、などなど。

equals について補足。Java ではインスタンスの比較に == か equals を用いるわけだけど、どちらもデフォルトでは参照の同値性、つまり同一性を比較する。すなわち、"a" == "a" は常に false を返す。また、new Object().equals(new Object()) も、常に false を返す。

とまぁここまではいいとして、これらには値としての同値性(以下同値性)を調べるという部分がすっぽりと抜けている。Java ではそういうことがしたいなら equals をオーバーライドせよということになっている。

いやいや待てと。equals ってのはそもそも同一性を調べるメソッドなのであって、同値性を調べるメソッドではないでしょう。メソッドの意味を大きく変更することになるオーバーライドはするべきではない。

"内部動作" を置き換えるオーバーライドは、本来の使われ方として正しいんだろう。繰り返しになるが、メソッドの "意味" を置き換えるオーバーライドは行うべきではない。それを奨励している Java は、オブジェクト指向言語としてはとても至高とは呼べない。

package について補足。Java のパッケージはファイルシステムべったりで、ディレクトリ階層がそのままパッケージ階層になる。別にそれはいいんだけど、そうやって階層構造を持たせることができるのなら、例えば「methodA を、この hoge.fuga パッケージ以下に位置する、hoge.fuga.piyo と hoge.fuga.pico パッケージにのみ公開」なんて指定できると思っちゃうのは必然ではないだろうか?

もちろん、今の Java ではこういうことはできない。package が階層構造である意味は、全くを持って意味が無い。ネームスペース以外の何者でもないくせに、ディレクトリ階層を要求する。

あと Object にメソッドが多いのも気になる。equals, hashCode, wait, notify, notifyAll, clone, toString 辺りが、なんで Object にあるのかと。同値性の比較が可能なインタフェース(Comparable)、条件変数として使用可能なインタフェース(Condition)、文字列かできるインタフェース、複製可能なインタフェース(Cloneable)、ってのをそれぞれ用意するべきだよ。いや、文字列化以外のは現にあるんだけど。Object にこれらのメソッドを持たせる利点が、どれほどあるのかと。

clone については、Cloneable インタフェースがありながらこの状態なわけで。そういう気持ち悪いところがたくさんある。

そんなわけで俺が思う至高のオブジェクト指向言語は Eiffel。オブジェクト指向入門で使われている、あの言語。実際に使ったことはないんだけど。本を読んだ限り、非常に言語仕様が洗練されている。総称もしっかりしているし、スコープ指定もしっかりしていてカプセル化も柔軟。オブジェクト指向言語としては、かなりの完成度かと。ただまぁ、API は少ないだろうから実用的では無いのかも。

スポンサーサイト

comment

post




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。