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:
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
?
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. –
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