« コレクション: インタフェースか具象クラスか | トップページ | pi_fftc6 »

2006年8月30日 (水)

コレクション: Java vs .NET

さっきの続き。

なんだかんだ言って、.NET Framework のコレクションの設計はかなり悪いと思う。Java のコレクションフレームワークがとてもよくできているので、それに比べれば劣って見えるだけなのだろうか。でも、Java よりも後から出てきた .NET がなぜ Java のコレクションを真似なかったのか。真似をするだけでも十分いいコレクションシステムができたろうに。それとも真似はしたけれども「劣化コピー」にとどまってしまったということだろうか。

ともかく、Java のコレクションフレームワークの設計が秀逸なのに対し、.NET のそれは遥かに劣っている。Java はインタフェースと具象クラスの使い分けが適切になされているが、.NET はそうではない。そのせいで、Java のコレクションではできるのに .NET のコレクションではできないことが非常に多い。

Java では、インタフェースで必要な機能を定義し、具象クラスで実装するという使い分けが正しくなされているので、リストやコレクションをインタフェース型にアップキャストしても不便はほとんど生じない。そのため、java.util.Collections.unmodifiableList メソッドのように、リストをインタフェース型で受け取ってインタフェース型で返すメソッドを有効に活用できる。

ところが、.NET のコレクション機能では、インタフェースに定義してある機能が貧弱なので、リストやコレクションをインタフェース型にアップキャストするとほとんど使い物にならなくなる。List には Find とか IndexOf とか便利な機能が揃っているのに、インタフェースにはそれが定義されていない。これでは何のためにインタフェースがあるのか分からない。

ジェネリックの実装がおざなりなのも問題だ。既存の非ジェネリックなコレクションとは別に、新しくジェネリックなコレクションの機能を追加したこと自体は問題ない。問題は、既存の「特定の型に特化した非ジェネリックコレクション」に何も手が加えられていないことだ。例えば、System.Collections.Specialized.StringCollection という文字列に特化した非ジェネリックなリストクラスがある。このクラスはジェネリックが導入される前からあったわけだが、ジェネリックを導入したとき、IList<string> インタフェースを実装するように改良されなかった。実態としては StringCollection は文字列のリストなので IList<string> にキャストできて当然のように思われるが、実際には StringCollection は IList<string> を実装していないのでキャストできない。非ジェネリックな IList インタフェースは実装しているのに、ジェネリックな IList<string> インタフェースは実装していないというなんとも中途半端なクラスなのだ。こういうクラスはほかにも System.Text.RegularExpressions.MatchCollection や System.Windows.Forms.Control.ControlCollection などたくさんある。せっかくジェネリックを導入したのに、実装が非ジェネリックなままでは使い物にならない。

ジェネリックとは関係ないところでも、.NET のコレクションはインタフェースの扱いがひどすぎる。LinkedList が IList インタフェースを実装していないとはどういうことか。IDictionary はあるのに ISortedDictionary はないし。

|

« コレクション: インタフェースか具象クラスか | トップページ | pi_fftc6 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/169172/11682829

この記事へのトラックバック一覧です: コレクション: Java vs .NET:

« コレクション: インタフェースか具象クラスか | トップページ | pi_fftc6 »