2013-05-07 10 views
8

これはまさにプログラミングに関する質問ではありません。しかし...NodeListがCollectionまたはIterableを拡張しないのはなぜですか?

なぜorg.w3c.dom.NodeListjava.lang.Iterableインターフェイスの拡張ではありませんか?

私にとっては直感的ではないようです。特に、ドキュメントには次のように書かれています。

NodeListインターフェイスは、このコレクションの実装方法を定義または制約することなく、ノードの順序付きコレクションの抽象化を提供します。 DOMのNodeListオブジェクトはライブです。 NodeListの中 のアイテムは0

PSから始まる整数のインデックスを使用してアクセスできます:該当する場合は、適切な引用とあなたの答えをバックアップしてください。

+6

DOMがひどいので、 'Iterable'よりもずっと前になっていますが、私の推測では、" Java-likeeness "とは関係なく、W3C仕様の完全な単純な"ポート "であり、APIの作り方より良いと互換性を破ることはありません。 (参照: 'カレンダー'。) – millimoose

+0

@millimooseそれは恐ろしいだろう - もし本当なら!これについての証拠がありますか、それともこの部分を推測していますか?私はこれに関するどこにもドキュメンテーションを見つけることができませんでした。 – zEro

+0

あなたはそのような証拠があると仮定しますが、JDKもJavaも最初は開かれていませんでした。何年も何年も前に、何人かのSOのメンバーでもない少数の人々が、なぜ呼び寄せをしたのか、誰もその間に他の人を決めるのを知りたいのであれば、これは本当に尋ねる場所ではありません。 JSRサイトを見て、拒否理由がある特定のXML関連の提案があるかどうかを調べることができます:http://jcp.org/ja/jsr/tech?listBy=1&listByType=tech。私が見つけることができる最も近いのは、10年間の誰も気遣っていないことから取り去られたJDOMのものです。 – millimoose

答えて

9

org.w3c.dom.NodeList pred Iterable Javaバージョン1.5で導入されました。

多分互換性の理由で更新されていないかもしれませんが、私はこれについての参照はありません。

+0

ああ!それは正しい答えのようです。私は、NodeListが実際にIterableが導入されたJavaバージョン1.5より前のものであることを確認しました。 – zEro

+2

このような間違いはAPIを更新しないことになります!私は、数百万の開発者が非互換性を呪っていることを視覚化しています。 – zEro

+2

私は彼らが他の理由でもそれを呪うと確信しています。これは本当に厄介なAPI、典型的なデザインごとの委員会の犬のいたずらです。 –

2

w3cは仕様(XML、XSLT、DOMなど)を定義するだけで、APIを特定の言語やプラットフォームに合わせようとしていません。

これらのパーサーを使用する既存のコードに準拠する製品を作成するためのガイドラインとして、パーサーの開発者を対象としています。

アプリケーションフレームワークを構築する際には、すべてのAPI呼び出しをラップして、異なる言語または異なるプラットフォームでAPIへのアクセス方法を制御できるようにすることをお勧めします。

Java、JavaScript、C#などで使用する場合は、API呼び出しにラップするクラス\オブジェクトを作成します。 JavaScriptでは、クロスブラウザ対応のコードを作成するときに役立ちます。複数のプラットフォーム用のソリューションを公開する場合は、ラッパークラスを更新するだけで済みます。

以下の例がありますが、あなたが望むように気に入ったようになり、固有の実装を提供するために独自のラッパーインターフェイスと子クラスをオーバーライドした基本クラスを定義できます。

function XMLNode(xnode) { 
    this.xnode = xnode; 
} 

function getNodes(path, xnode) { 
    if (browseTYPE != IE) { 

     //Ordered SnapShot 
     if (xnode.evaluate)   
      fld = xnode.evaluate(path, xnode, null, 7, null); 
     else 
      fld = xnode.ownerDocument.evaluate(path, xnode, null, 7, null); 

     //We need a result wrapper here 
     if (fld != null) return new XMLSnapShotList(fld); 

    } else { 
     fld = xnode.selectSingleNode(path).childNodes; 

     //We need a result wrapper here 
     if (fld != null) return new XMLList(fld); 
    } 
    return null; 
} 

XMLNode.prototype.getNodes = getNodes; 
関連する問題