2015-10-15 15 views
7

remove()のインタフェースを持つjava.util.Iteratorのインタフェースはなぜですか?JavaコアのIteratorにおける単一責任の原則の違反

確かにこの方法が必要であり、すべてがその存在に慣れてきたことがあります。しかし実際、イテレータの主目的は、アクセスコンテナ要素を提供することだけです。そして、誰かがこのインタフェース用に独自の実装を作成したい場合、要素を削除する機能を提供することができない、またはしたくない場合は、UnsupportedOperationExceptionを強制的にスローします。そして、その例外を投げることは、通常、あまりよく考えられていないアーキテクチャや設計上のいくつかの欠陥を示しています。

本当に私はそのような決定の理由を理解していません。そして、私はそれがより正確に任意の方法をサポートするための特定のサブインターフェイスを分離されるだろうと思います。

diagram

remove()Iteratorの一部である理由の任意の推論のバージョン? SOLIDからの単一責任原則の直接違反のこの例ではありませんか?

+0

実際に、ここで提案する「削除セマンティクスのないイテレータ」は、従来の['Enumeration'](http://docs.oracle.com/javase/8/docs/api/java/util/ Enumeration.html)インターフェースで、Java 1.2の 'Iterator'に置き換えられました。 –

+1

「新しいタイプの基礎となるコレクションが導入されました」以外の変化のベクトルは何ですか? SRPを「変更する理由が多すぎる」のではなく「あまりにも多くのことをやっている」と考えると、プログラムのすべてのメソッドに独自のインターフェイスが設定されている、狂った通常のフォームが実行されます。 – Affe

答えて

6

ファンシーな技術的な回答に加えて...タイムラインも考慮してください。 90年代後半のある時点でロバート・マーティンによって「単一の責任原理」が発案されました。

Javaイテレータインタフェースは、Java 1.2で実現しました。

Sunの人々は、Javaの初期リリースで作業している間に、この概念について聞いたことがない可能性が非常に高いです。

もちろん、多くのスマートな人が同じアイデアを持っていますが、良いデザイナーは「SRP」を知らなくても「SRP」を実装しているかもしれませんが、このルールのすべての大小違反を公開する...

+0

[Bob Uncle](https://en.wikipedia.org/wiki/Robert_Cecil_Martin)の「アジャイルソフトウェア開発:原則、パターン、および実践」は、2002年に実際に公開されました。 –

+0

@MickMnemonic私は知っています。しかし、SRPに関するウィキペディアの記事を慎重に調べると、あなたが言及している本はいくつかの記事に基づいていることがわかります。 – GhostCat

+0

要点は用語ではありません。問題はそれが良い解決策であるかどうかです。特定の分類または抽象定義に基づくものではなく、常識および設計のベストプラクティスという観点から。 – kapand

3

このデザインの決定はJava Collections API Design FAQで説明されています。具体的には、コレクションが不変性をサポートしておらず、代わりにオプションの操作が必要な理由に関する最初の質問を参照してください。簡単な答えは、インターフェイスの数が「爆発」したくないということです。

2

ここではセマンティクスが混在しているようです。 Robert C. Martinは、単一の責任を「変化する単一の理由」(SRP.pdf)と定義しています。 SRPは、の結束と非常に関連しています:ソフトウェアモジュールは、互いに機能的に関連しているものだけを含むべきです。

これらのことを念頭に置いて、私はIteratorに含まれているremoveメソッドがSRPに違反しているとは思いません。要素を削除することは、要素を反復処理している間にやりたいことがあります。操作は本質的に密接なものです。また、Iteratorで要素の削除を有効にすると、Iterableインターフェイス(Java 5で追加されたインターフェイス)がはるかに強力になります。この特徴は、例えば、多くの方法がGuava's Iterables utility classにあります。

アンクルボブ自身の用語の歴史についての詳細はthis excellent articleです。

+0

この問題は、意味論的形式に結びついていません。原則の特定の名前から出発する。それはポイントではありません。私はそれに集中すべきではありませんでした。私はこの決定とその意味の評価に興味があります。結局のところ、イテレータは、主な目的と古典的な定義によって削除操作を提供してはいけません。 – kapand

関連する問題