2013-05-07 12 views
8

Forse questa non è esattamente una domanda di programmazione. Ma ...Perché NodeList non estende Collection o Iterable?

Perché org.w3c.dom.NodeList non è un'estensione dell'interfaccia java.lang.Iterable?

Sembra così controintuitivo per me. Soprattutto perché la documentazione dice:

L'interfaccia NodeList fornisce l'astrazione di una collezione ordinata di nodi, senza definire o vincolare come questa collezione è implementato. Gli oggetti NodeList nel DOM sono attivi. Le voci del NodeList sono accessibili tramite un indice integrale, a partire da 0.

PS: Si prega di eseguire le vostre risposte con le citazioni appropriate, se del caso.

+6

Perché DOM è terribile. Precede 'Iterable' di molto, e la mia ipotesi è che sia semplicemente una" porta "completamente diretta delle specifiche del W3C senza riguardo per" Java-somiglianza ", e a nessuno interessa davvero tornare indietro per capire come rendere l'API più bello e non rompere la compatibilità. (Vedi anche: 'Calendario'.) – millimoose

+0

@millimoose Sarebbe terribile, se fosse vero! Abbiamo qualche prova per questo o stiamo solo indovinando questa parte? Non sono riuscito a trovare alcuna documentazione da nessuna parte per quanto riguarda questo. – zEro

+0

Si presume che tale prova esista, ma né JDK né Java sono stati inizialmente sviluppati allo scoperto. Questo non è il posto giusto per chiederti se vuoi sapere perché un piccolo gruppo di persone, nessuno dei quali è membro SO, ha fatto una chiamata anni e anni fa, o perché nessuno ha deciso diversamente nel frattempo. Potresti provare a consultare il sito JSR per vedere se ci fossero proposte specifiche relative a XML che potrebbero avere motivi di rigetto: http://jcp.org/en/jsr/tech?listBy=1&listByType=tech. Il più vicino che riesco a trovare è il JDOM che è stato ritirato dopo dieci anni di non interesse. – millimoose

risposta

9

org.w3c.dom.NodeList precedente a Iterable, introdotto in Java versione 1.5.

Forse non è stato aggiornato per motivi di compatibilità, ma non ho riferimenti per questo.

+0

Oh! Sembra la risposta giusta.Ho appena controllato che NodeList sia effettivamente precedente alla versione 1.5 di Java durante la quale è stato introdotto Iterable. – zEro

+2

Un errore così terribile da non aggiornare l'API! Sto visualizzando milioni di sviluppatori che maledicono l'incompatibilità. – zEro

+2

Sono sicuro che lo maledicano anche per altri motivi. È un'API veramente raccapricciante, tipica merda del cane design-by-committee. –

2

Il w3c definisce solo le specifiche (XML, XSLT, DOM, ecc.) E non sta tentando di allineare l'API a una lingua o piattaforma specifica.

È destinato allo sviluppatore di parser come linea guida per la produzione di un prodotto conforme al codice esistente che utilizza questi parser.

Quando si crea il framework dell'applicazione, è meglio racchiudere tutte le chiamate API in modo da poter controllare il modo in cui l'API viene utilizzata in lingue diverse o su piattaforme diverse.

In Java, JavaScript, C# o qualsiasi altro utilizzo, creare un oggetto \ class che avvolge l'accesso alle chiamate API. In JavaScript sarà utile quando si rende il codice compatibile con il cross-browser, se si pubblica la soluzione per più piattaforme, sarà sufficiente aggiornare la classe wrapper.

Ecco un esempio qui di seguito, tuttavia, è possibile ottenere quanto vuoi, definire la propria interfaccia wrapper e la classe di base con classi discendenti che eseguono l'override per fornire implementazioni specifiche.

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; 
Problemi correlati