2012年3月26日月曜日

Java コレクション API の設計に関する FAQ


省略可能オペレーション (および UnsupportedOperationException 例外) を排除できるように、コアコレクションで不変性を直接サポートしてはどうでしょうか。

これは、API 全体でもっとも議論の余地のある設計上の決定事項です。静的な (コンパイル時の) 型チェックが望ましいのは明らかで、Java の標準でもあります。静的な (コンパイル時の) 型チェックが望ましいのは明らかで、Java の標準でもあります。可能ならばサポートしたかったのですが、これをサポートするとインタフェース階層のサイズが非常に大きくなり、実行時の例外の必要性を (かなり減らすことはできても) なくすことができません。


どのようにMicrosoft Accessの自動サイズテキストボックスに

Doug Lea は、インタフェース階層に可変性の特徴を反映したポピュラーな Java コレクションを作成しました。 しかし、そのコレクションパッケージのユーザーとしての経験から、このアプローチはもはや実行可能ではないと考えています。彼は、私信の中で「これを言うのはつらいが、強力な静的型設定は Java のコレクションインタフェースでは機能しない」と述べています。

問題を詳しく説明するために、階層に修正可能性という概念を追加しようとする場合、ModifiableCollection、ModifiableSet、ModifiableList、ModifiableMap の 4 つの新しいインタフェースが必要になります。以前は単純だった階層が複雑になります。また、削除オペレーションを持たない修正不可能なコレクションで使用するための新しい反復子が必要になります。この状態で、UnsupportedOperationException を排除することはできません。


セキュリティコードは何ですか

配列について考えます。配列にはほとんどの List 操作が備わっていますが、削除と追加の操作はありません。 配列は「固定サイズ」の List です。階層にこの概念を与えようとすると、VariableSizeList と VariableSizeMap の 2 つの新しいインタフェースが必要になります。VariableSizeCollection と VariableSizeSet は、ModifiableCollection と ModifiableSet に等しいので追加する必要はありませんが、一貫性のために追加しなければならない場合があります。また、変更不可能な List に対処するため、追加と削除のオペレーションをサポートしない新種の ListIterator が必要です。最初に必要だったのは 4 つのインタフェースだけでしたが、このように 10 ~ 12 個のインタフェースに加えて 2 個の新しい反復子インタフェースが必要になります。しかし、それでも十分ではありません。


コンボボックスslectedアイテムを使用する方法

ログ (エラーログ、監査ログ、修復可能なデータオブジェクト用のジャーナル) について考えます。これらは、本質的に追加専用シーケンスで、削除と設定 (置換) 以外のすべての List オペレーションをサポートします。ログには、新しいコアインタフェースと新しい反復子が必要になります。

修正不可能なコレクションとは対照的な、不変性のあるコレクション (つまり、クライアントによる変更が不可能で、かつ他のどんな理由によっても変化しないコレクション) についてはどうでしょうか。多くの人が、これがもっとも重要な特徴であると主張しています。 その理由は、複数のスレッドが (同期の必要なく) 同時に 1 つのコレクションにアクセスできるからです。型の階層にこれを追加するには、さらに 4 つのインタフェースが必要です。


これで、インタフェースの数は最大 20 個程度、反復子は 5 個になりました。 実際には、明らかにどのインタフェースにも適合しないコレクションが増えているのはほぼ確実です。たとえば、Map から返されるコレクションビューは本質的に削除専用コレクションです。また、値に基づいて特定の要素を拒否するコレクションもあるので、実行時の例外を排除することはできません。

議論と試行の末、実行時例外を発行できるコアインタフェースのごく小さなセットを提供することで問題全体を回避することが、道理にかなった技術的妥協案であるとの結論に達しました。



These are our most popular posts:

Stroustrup: C++ Style and Technique FAQ 日本語訳

なぜauto arrayはないのですか; C++が異種コンテナを提供しないのはなぜですか; 標準コンテナがとても遅いのはなぜですか. メモリ. メモリリークには ... おろかな間違い」 を犯さないで配列へ読み込むのは、まったくの初心者にとって非常に難しいことです。 これを正しくできたとき、 ..... 違反しません。はアクセスを許可するための明示的 なメカニズムで、メンバシップのようなものです。 ..... ヒープオブジェクトは単純な スコープ化された振る舞いをサポートしません(これはリソース管理を複雑にします)。 共通基底クラス ... read more

C++についてLinus Torvaldsへの反論

2010年3月1日 ... 率直に言えば、たとえCの選択がただC++プログラマを立入らさせないためであるとして も、それはそれでCを使う大いなる理由となろう。 ... 最初のパラグラフにおいて、 Torvaldsは合理的な主張も述べていないし、何故CがC++よりも良い選択であるかの 理由も述べていないが、彼の仮定である ... ー非効率な抽象化プログラミングモデル。2 年先に人は一部の抽象化がそれ程効率的ではなかったことに気付く。 .... STLデータ コンテナを使えば、一部の古いC++コンパイラがサポートしていない場合があると。 read more

FAQ - golang.jp

配列は値であるが、マップ・スライス・チャネルが参照型である理由は? ... JavaやC++の ような扱いにくい型システムに対する反発が大きくなりつつあり、これがPythonや JavaScriptといった動的な型言語を ..... 並列性のサポートを言語的に高レベルで提供 するモデルのうちで、最も成功しているものは、Hoareの「Communicating ... 型と インタフェース間には明示的な関連性がないため、管理や検討が必要となる型階層は 存在しません。 read more

C++ - Wikipedia

静的な型システムを持ち、手続き型プログラミング・データ抽象・オブジェクト指向 プログラミング・ジェネリックプログラミングといった .... コンテナ(可変長配列やリストなど) 、コンテナを配列のように扱えるようにするイテレータ、検索やソートを行うアルゴリズム といった有用なツールが提供されている。 ... C言語に、オブジェクト指向プログラミングを サポートするための改良が加えられたものといえるが、他のオブジェクト指向を念頭 において作 ... read more

Related Posts



0 コメント:

コメントを投稿