Dlaczego indeksy w XPath zaczynają się od 1, a nie od 0?


117

Razem z kilkoma kolegami porównaliśmy poprzednie języki, w których programowaliśmy, i rozmawialiśmy o naszych doświadczeniach z VBScript z jego dziwnymi funkcjami, takimi jak indeks oparty na 1 zamiast indeksów opartych na 0, jak ma to miejsce w prawie każdym innym języku, rozumując, że był to język dla użytkowników (np. Excel VBA) zamiast języka dla programistów.

Następnie ktoś powiedział: „ XPath ma również indeksy oparte na 1 ”, w co nie mogłem uwierzyć, dopóki nie znalazłem tego artykułu, w którym podano wiele powodów przemawiających za podejściem opartym na zerach, w tym kilka od samego Michaela Kaya:

  • „... indeksowanie od zera zwykle upraszcza formuły indeksów podczas uzyskiwania dostępu do wielowymiarowej tablicy z jednowymiarowym wyrażeniem dostępu do tablicy”
  • „podczas obsługi tabel lub indeksowania do łańcuchów, adresowanie od zera byłoby często znacznie wygodniejsze”
  • „… adresowanie sprzętowe nie jest jedyną korzyścią wynikającą z adresowania opartego na zerach… ułatwia również obliczenia…”

ale potem Michael Kay jest cytowany jako podsumowujący:

... logika oparta na 1 była właściwym wyborem dla XPath i XSLT ... ponieważ język został zaprojektowany dla użytkowników, a nie dla programistów, a użytkownicy nadal mają ten staroświecki zwyczaj nazywania pierwszego rozdziału książki jako rozdziału Jeden...

Czy ktoś może mi to wyjaśnić? (1) W jaki sposób XPath jest przeznaczony dla użytkowników? Nie wyobrażam sobie nikogo, kto nie jest programistą, zmagającego się ze sztywnością składniową XPath lub deklaratywnymi / funkcjonalnymi aspektami programowania XSLT. oraz (2) Dlaczego twórcy XPath rzeczywiście wystąpili wbrew normom współczesnych języków programowania, wybierając indeks oparty na 1?


7
W tym samym artykule zacytowano Michaela następującymi słowami: „Nie mogę wam powiedzieć, jaka była faktyczna historia tej decyzji; mogę ją tylko postracjonalizować”. Jeśli nawet on nie wie, prawdopodobnie nie ma satysfakcjonującej odpowiedzi.
Dirk Vollmar

5
Głosowałem za ZAMKNIĘCIEM tego pytania jako subiektywnego i argumentującego. Indeksowanie oparte na 0 nie jest w żaden sposób lepsze niż indeksowanie oparte na 1 i odwrotnie: indeksowanie oparte na 1 nie jest w żaden sposób lepsze niż indeksowanie oparte na 0. Obie mają plusy i minusy. Indeksowanie oparte na 1 jest bardziej naturalne dla nieprogramistów. Pozwala również określić górną granicę zakresu jako nniezbyt nienaturalną i często prowadzącą do błędów n - 1. Dla każdego, kto ma wypaczoną logikę „nowoczesnego programowania”, rozpoczęcie korzystania z indeksowania opartego na 1 byłoby przyjemnym i odświeżającym doświadczeniem :)
Dimitre Novatchev

3
odpowiedzi na to pytanie dotyczące stackoverflow pokazują, że indeksy oparte na 0 są preferowane z wielu powodów: stackoverflow.com/questions/393462/defend-zero-based-arrays
Edward Tanguay

9
Moje pytanie jest tak naprawdę prawdziwe, ponieważ uczę programowania i chcę mieć odpowiedź na to pytanie dotyczące indeksów xpath na wypadek, gdyby się pojawiło. Myślę, że najlepszą odpowiedzią jest to, że indeks oparty na 1 jest mapowany na position (), który jest często używany w xpath.
Edward Tanguay

64
Myślę, że to uzasadnione pytanie i nie powinno być zamknięte. Pyta o fakt historyczny, który nie jest kwestią opinii, a odpowiedź byłaby pouczająca.
Ben Flynn,

Odpowiedzi:


30

Tablice i inne indeksy kolekcji reprezentują przesunięcia pamięci, więc logicznie rzecz biorąc, zaczynają się od zera. Indeksy XML i XPATH reprezentują pozycje i liczby, więc logicznie rzecz biorąc, zaczynają się od jedynki (a zatem zero jest reprezentatywne dla „pustego”)


8

Aby odpowiedzieć na to pytanie, musimy zbadać historię niektórych technologii.

RSS XML XSLT i XPath History

Wersja 0.9 RSS została pierwotnie wydana jako RDF Site Summary w 1999 roku przez kilku gości z portalu Netscape dla portalu my.netscape.com firmy Netscape. Później tego samego roku, wraz z aktualizacją v0.91, zmieniono jego nazwę na RSS (Rich Site Summary). Rozwój projektu kilkakrotnie zmieniał właścicieli, ale wersja 1.0 RSS została wydana w grudniu 2000 r. Wraz z aktualizacją v1.0, RSS zawiera obsługę XML.

W 2002 roku wersja 2.0 została wydana we wrześniu jako RSS (Really Simple Syndication) i zaczęła ewoluować w jedną z głównych technologii internetowych. We wczesnej historii kanały RSS (i zawarte w nich dane XML) były odczytywane przez ludzi w surowym formacie. Blogi i inne źródła wiadomości wykorzystywały kanały RSS i XML do generowania stale aktualizowanych informacji. Ponieważ XML był czytany przez zwykłych śmiertelników (nie programistów), XPath i XSLT również musiały być łatwo zrozumiałe, aby zwykli śmiertelnicy nie byli przytłoczeni złożonością interakcji z nim. Dlatego XPath naśladuje styl URI, który jest czymś, co użytkownicy końcowi byli już zaznajomieni. Jednym z ustępstw poczynionych w celu zapewnienia czytelności przez użytkowników było stosowanie przestarzałych technik numeracji, tj. Indeksów opartych na 1 zamiast indeksów opartych na 0.

Chociaż kanały RSS i XML zostały stworzone tak, aby były czytelne dla większości ludzi, czytniki RSS zostały opracowane, aby zapewnić ludziom przyjemniejszy interfejs do czytania kanałów RSS. Teraz surowe dane RSS i XML są odczytywane prawie wyłącznie za pomocą jakiegoś czytnika lub interfejsu graficznego. XML jest nadal w częstym (być może stałym) użyciu w Internecie, ale jest maskowany przez fantazyjne graficzne interfejsy użytkownika, aby zapewnić lepsze wrażenia użytkownikom końcowym.

* Termin „ zwykli śmiertelnicy ” odnosi się do ludzi, którzy nie są programistami


5
Nie jestem przekonany, że ma to tak wiele wspólnego z RSS. Na przykład w tej specyfikacji XSL (która później rozdzieliła na XPath i inne ) z kwietnia 1999 r. „Funkcja position () zwraca pozycję węzła kontekstu na liście węzłów kontekstu. Pierwsza pozycja to 1, a więc ostatnia pozycja będzie równa last (). " Czy jacyś „zwykli śmiertelnicy” używali RDF w okresie do kwietnia 1999 roku, kiedy to zostało zredagowane?
Matt Gibson,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.