2013-05-07 17 views
8

Być może nie jest to dokładnie pytanie programistyczne. Ale ...Dlaczego NodeList nie rozszerza kolekcji lub Iterable?

Dlaczego org.w3c.dom.NodeList nie jest rozszerzeniem interfejsu java.lang.Iterable?

Brzmi to dla mnie bardzo intuicyjnie. Szczególnie dlatego, że dokumentacja mówi:

Interfejs NodeList zapewnia abstrakcję uporządkowanego zbioru węzłów, bez definiowania lub ograniczania sposobu, w jaki ta kolekcja jest zaimplementowana. Obiekty NodeList w DOM są aktywne. Pozycje w liście węzłów są dostępne za pośrednictwem integralnego indeksie, zaczynając od 0.

PS: w stosownych przypadkach proszę wykonać kopię swoje odpowiedzi z odpowiednimi cytatami.

+6

Bo DOM jest okropny. Dużo wyprzedza 'Iterable' i domyślam się, że jest to po prostu całkowicie" port "specyfikacji W3C, bez względu na" podobieństwo Java ", i nikt tak naprawdę nie chciał wrócić, aby dowiedzieć się, jak zrobić API ładniejsza i nie łamliwa kompatybilność. (Zobacz także: 'Kalendarz'.) – millimoose

+0

@millimoose To byłoby okropne - jeśli to prawda! Czy mamy jakieś dowody na to, czy po prostu zgadujemy tę część? W tej sprawie nie mogłem znaleźć żadnej dokumentacji. – zEro

+0

Zakładasz, że takie dowody istnieją, ale ani JDK, ani Java nie zostały początkowo opracowane na otwartej przestrzeni. Nie jest to naprawdę miejsce, o które należy zapytać, czy chcesz wiedzieć, dlaczego mała grupa ludzi, z których żadna nie jest członkiem SO, nie wykonała danego połączenia wiele lat temu lub dlaczego nikt nie zdecydował inaczej w czasie interwencji. Możesz spróbować spojrzeć na stronę JSR, aby zobaczyć, czy istnieją konkretne propozycje związane z XML, które mogą mieć przyczyny odrzucenia: http://jcp.org/en/jsr/tech?listBy=1&listByType=tech. Najbliżej mogę znaleźć JDOM, który został wycofany po dziesięciu latach opieki nad nikim. – millimoose

Odpowiedz

9

org.w3c.dom.NodeList poprzedza Iterable, która została wprowadzona w wersji Java 1.5.

Być może nie został zaktualizowany ze względu na kompatybilność, ale nie mam żadnych referencji.

+0

Och! To wydaje się właściwą odpowiedzią.Właśnie sprawdziłem, czy NodeList rzeczywiście jest wcześniejsza od wersji Java 1.5, podczas której wprowadzono Iterable. – zEro

+2

Taki straszny błąd, aby nie aktualizować API! Wizualizuję miliony programistów przeklinających niekompatybilność. – zEro

+2

Jestem pewien, że przeklinają to również z innych powodów. To naprawdę makabryczne API, typowe psie psie po komisie. –

2

W3c definiuje tylko specyfikacje (XML, XSLT, DOM, itp.) I nie próbuje dopasować interfejsu API do żadnego konkretnego języka lub platformy.

Jest przeznaczony dla twórców analizatorów jako wytyczna do tworzenia produktu zgodnego z istniejącym kodem korzystającym z tych parserów.

Podczas budowania architektury aplikacji najlepiej jest zawijać wszystkie wywołania interfejsu API, aby można było kontrolować sposób uzyskiwania interfejsu API w różnych językach lub na różnych platformach.

W języku Java, JavaScript, C# lub jakimkolwiek innym używanym, utwórz klasę \ obiekt, który otacza dostęp do wywołań API. W JavaScript pomaga przy wykonywaniu kodu zgodnego z różnymi przeglądarkami, jeśli publikujesz rozwiązanie dla wielu platform, będziesz musiał tylko zaktualizować swoją klasę opakowania.

Oto przykład poniżej, jednak można uzyskać dowolną dowolność, zdefiniować własny interfejs opakowania i klasę bazową z klasami potomnymi, które mają charakter nadrzędny, aby zapewnić określone implementacje.

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;