2013-05-07 28 views
8

Có lẽ đây không phải là câu hỏi lập trình chính xác. Nhưng ...Tại sao NodeList không mở rộng Bộ sưu tập hoặc Iterable?

Tại sao org.w3c.dom.NodeList không phải là phần mở rộng của giao diện java.lang.Iterable?

Nghe có vẻ rất trực quan với tôi. Đặc biệt là vì tài liệu hướng dẫn cho biết:

Giao diện NodeList cung cấp sự trừu tượng hóa bộ sưu tập các nút được sắp xếp, mà không xác định hoặc hạn chế cách bộ sưu tập này được triển khai. Các đối tượng NodeList trong DOM là trực tiếp. Các mục trong NodeList có thể truy cập được thông qua chỉ số tích phân, bắt đầu từ 0.

PS: Vui lòng trả lời lại bằng các trích dẫn thích hợp nếu có.

+6

Vì DOM quá khủng khiếp. Nó có thể xuất hiện trước rất nhiều, và tôi đoán nó chỉ là một "cổng" hoàn toàn đơn giản của đặc tả W3C mà không quan tâm đến "giống Java", và không ai thực sự quan tâm đến việc tìm hiểu cách tạo API đẹp hơn và không phá vỡ khả năng tương thích. (Xem thêm: 'Lịch'.) – millimoose

+0

@millimoose Điều đó thật kinh khủng - nếu đúng! Chúng ta có bất kỳ bằng chứng nào cho điều này hay chúng ta chỉ đoán phần này? Tôi không thể tìm thấy bất kỳ tài liệu nào ở bất cứ đâu liên quan đến điều này. – zEro

+0

Bạn cho rằng bằng chứng đó tồn tại, nhưng cả JDK lẫn Java đều không được phát triển lần đầu tiên. Đây không phải là nơi để hỏi xem bạn có muốn biết tại sao một nhóm người nhỏ, không ai trong số đó là thành viên SO, thực hiện một cuộc gọi nhất định trong nhiều năm trước hoặc tại sao không ai quyết định khác trong thời gian can thiệp. Bạn có thể thử xem trang JSR để xem có đề xuất liên quan đến XML cụ thể nào có thể có lý do từ chối không: http://jcp.org/en/jsr/tech?listBy=1&listByType=tech. Gần nhất tôi có thể tìm thấy là một trong những JDOM đã được rút ra sau mười năm không ai quan tâm. – millimoose

Trả lời

9

org.w3c.dom.NodeList đặt trước Iterable, được giới thiệu trong phiên bản Java 1.5.

Có thể nó không được cập nhật vì lý do tương thích, nhưng tôi không có tài liệu tham khảo cho việc này.

+0

Oh! Điều đó có vẻ giống như câu trả lời đúng.Tôi chỉ kiểm tra rằng NodeList thực sự có trước phiên bản Java 1.5 trong đó Iterable đã được giới thiệu. – zEro

+2

Như một sai lầm khủng khiếp không cập nhật API mặc dù! Tôi đang hình dung hàng triệu nhà phát triển đang nguyền rủa sự không tương thích. – zEro

+2

Tôi chắc chắn họ cũng nguyền rủa nó vì những lý do khác. Đó là một API thực sự khủng khiếp, điển hình bởi các con chó crap. –

2

W3c chỉ xác định thông số kỹ thuật (XML, XSLT, DOM, v.v ...) và không cố gắng căn chỉnh API cho bất kỳ ngôn ngữ hoặc nền tảng cụ thể nào.

Dự định dành cho nhà phát triển trình phân tích cú pháp là hướng dẫn để tạo ra sản phẩm tuân thủ mã hiện có sử dụng các trình phân tích cú pháp này.

Khi bạn xây dựng khung ứng dụng, tốt nhất nên bao gồm tất cả các cuộc gọi API để bạn có thể kiểm soát cách API được truy cập bằng ngôn ngữ khác hoặc trên các nền tảng khác nhau.

Trong Java, JavaScript, C# hoặc bất kỳ thứ gì bạn đang sử dụng, hãy tạo đối tượng lớp \ để kết thúc tốt đẹp việc truy cập các cuộc gọi API. Trong JavaScript, nó sẽ giúp khi thực hiện mã tuân thủ trình duyệt, nếu bạn xuất bản giải pháp của mình cho nhiều nền tảng, bạn sẽ chỉ phải cập nhật lớp trình bao bọc của mình.

Dưới đây là một ví dụ bên dưới, tuy nhiên, bạn có thể nhận được ưa thích như bạn muốn, xác định giao diện trình bao bọc của riêng bạn và lớp cơ sở với các lớp con ghi đè để cung cấp triển khai cụ thể.

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; 
Các vấn đề liên quan