2015-10-15 14 views
7

Tại sao giao diện java.util.Iterator có phương thức remove()?Vi phạm nguyên tắc trách nhiệm duy nhất trong Iterator từ lõi Java

Chắc chắn đôi khi phương pháp này là cần thiết và tất cả đã trở nên quen với sự hiện diện của nó. Nhưng trên thực tế, mục tiêu chính và duy nhất của trình lặp là chỉ cung cấp các phần tử vùng chứa truy cập. Và khi ai đó muốn tạo triển khai của riêng mình cho giao diện này và không thể hoặc không muốn vì bất kỳ lý do gì để cung cấp khả năng xóa phần tử, thì anh ta buộc phải ném UnsupportedOperationException. Và việc ném ngoại lệ đó thường chỉ ra một kiến ​​trúc không quá tốt hoặc một số sai sót trong thiết kế.

Thực sự tôi không hiểu lý do cho quyết định như vậy. Và tôi đoán nó sẽ là một cách chính xác hơn tách một subinterface cụ thể để hỗ trợ các phương pháp tùy chọn:

diagram

Bất kỳ phiên bản lý luận tại sao remove() là một phần của Iterator? Không phải ví dụ này là vi phạm trực tiếp nguyên tắc trách nhiệm duy nhất từ ​​SOLID?

+0

Thực ra, "trình lặp không có loại bỏ ngữ nghĩa" mà bạn đề xuất ở đây tương đương với ['Enumeration' kế thừa] (http://docs.oracle.com/javase/8/docs/api/java/util/ Enumeration.html) giao diện, được thay thế bằng 'Iterator' trong Java 1.2. –

+1

Vectơ thay đổi khác ngoài "Loại bộ sưu tập cơ bản mới được giới thiệu" là gì? Nếu bạn nghĩ SRP là "làm quá nhiều thứ" thay vì "có quá nhiều lý do để thay đổi" thì cuối cùng bạn sẽ gặp phải một hình thức bình thường điên rồ mà mọi phương thức trong chương trình của bạn đều có giao diện riêng. – Affe

Trả lời

6

Ngoài câu trả lời kỹ thuật ưa thích ... vui lòng xem xét tiến trình thời gian. "Nguyên tắc trách nhiệm duy nhất" được Robert Martin đặt ra vào một thời điểm nào đó vào giữa/cuối thập niên 90.

Giao diện trình lặp Java xuất hiện với Java 1.2; khoảng năm 1998.

Rất có thể là những người ở Sun chưa bao giờ nghe nói về khái niệm này trong khi làm việc trên các bản phát hành đầu của Java. Tất nhiên, nhiều người thông minh có cùng ý tưởng mà không đọc một cuốn sách về nó ... vì vậy một nhà thiết kế tốt có thể đã thực hiện "SRP" như không biết về "SRP" - nhưng nó cũng đòi hỏi mức độ nhận thức cao để công bố tất cả các vi phạm lớn và nhỏ của quy tắc này ...

+0

"Phát triển phần mềm nhanh nhẹn: nguyên tắc, khuôn mẫu và thực hành" của [Chú Bob] (https://en.wikipedia.org/wiki/Robert_Cecil_Martin) đã được xuất bản vào năm 2002. –

+0

@MickMnemonic Tôi biết. Nhưng khi bạn nghiên cứu cẩn thận bài viết wikipedia trên SRP ... bạn sẽ thấy rằng cuốn sách bạn đang đề cập đến dựa trên một số bài báo - và những cuốn sách được viết bắt đầu từ năm 1995 nếu tôi không nhầm! – GhostCat

+0

Điểm không phải là thuật ngữ. Câu hỏi đặt ra là liệu đó có phải là giải pháp tốt hay không. Từ quan điểm của ý thức chung và thiết kế thực hành tốt nhất, và không theo bất kỳ phân loại cụ thể hoặc định nghĩa trừu tượng. – kapand

3

Quyết định thiết kế này được giải thích trong Java Collections API Design FAQ. Cụ thể, hãy xem câu hỏi đầu tiên về lý do tại sao các bộ sưu tập không hỗ trợ tính bất biến và thay vào đó yêu cầu các hoạt động tùy chọn. Câu trả lời ngắn gọn là họ không muốn "bùng nổ" trong số lượng giao diện.

2

Dường như có sự kết hợp các ngữ nghĩa ở đây. Robert C. Martin định nghĩa trách nhiệm duy nhất là một "lý do duy nhất để thay đổi" (SRP.pdf), không phải là "chỉ làm một điều duy nhất". SRP có liên quan rất nhiều với sự gắn kết : một mô-đun phần mềm chỉ nên chứa những thứ liên quan đến chức năng với nhau.

Với những điều này trong tâm trí, tôi không nghĩ rằng có phương pháp remove được bao gồm trong Iterator vi phạm SRP. Loại bỏ một phần tử thường là một cái gì đó bạn có thể muốn làm trong khi lặp qua các phần tử; các hoạt động về cơ bản là cố kết. Ngoài ra, cho phép loại bỏ các phần tử thông qua Iterator làm cho giao diện Iterable (được thêm vào trong Java 5) mạnh hơn rất nhiều. Tính năng này được sử dụng, ví dụ: nhiều phương pháp trong Guava's Iterables utility class.

Thông tin thêm về lịch sử cụm từ trong số this excellent article của Bác Bob.

+0

Sự cố không được gắn với các biểu mẫu ngữ nghĩa. Khởi hành từ các tên nguyên tắc cụ thể. Đó không phải là vấn đề. Tôi không nên tập trung vào điều đó. Tôi quan tâm đến việc đánh giá quyết định này và ý nghĩa của nó. Sau cùng, trình vòng lặp không được cung cấp thao tác xóa theo mục đích chính của nó và định nghĩa cổ điển. – kapand

Các vấn đề liên quan