Các tính năng tùy chọn: phương thức mặc định hoặc giao diện tách biệt


8

Các giao diện chuyên dụng dường như là một cách tốt để hiển thị các tính năng tùy chọn trong hệ thống phân cấp loại dành riêng cho tên miền. Tuy nhiên, chúng cản trở việc sử dụng trang trí và các mẫu tổng hợp, cũng phổ biến trong loại phân cấp này.

Đặc biệt, có lẽ không ai muốn triển khai một trình trang trí / kết hợp cho mỗi kết hợp có thể của các giao diện này, vì vậy thường xuyên hơn là chúng không thực hiện tất cả các giao diện tùy chọn và sử dụng kiểm tra loại để chuyển tiếp các cuộc gọi một cách có chọn lọc, nhằm đánh bại mục đích của các giao diện riêng biệt.

Một cách khác, mà khung công tác Bộ sưu tập Java sử dụng, là bao gồm tất cả các hoạt động trong loại cơ sở và chỉ cần điền chúng vào các triển khai giả. Các phương thức mặc định trong Java 8 tạo điều kiện thuận lợi hơn cho việc sử dụng này.

Theo một cách nào đó, điều này cảm thấy giống như các cột không thể tranh luận trong thế giới cơ sở dữ liệu. Có bất kỳ lập luận mạnh mẽ chống lại cách tiếp cận sau thực tế hơn?


Bạn có bị giới hạn trong Java hoặc JVM không? Bởi vì Scala đã giải quyết gọn gàng này
Frank

@Frank Tôi mơ ước có thể sử dụng Scala hoặc bất kỳ ngôn ngữ nào có đặc điểm, nhưng thật không may, sử dụng Java 8 đã là một bước nhảy vọt lớn cho công ty của tôi ...
billc.cn

Câu trả lời:


2

Một giải pháp cho vấn đề này tôi đã sử dụng trước đây (trong đó một số lượng lớn các nhà trang trí thêm các cơ sở vào một cơ sở tương đối đơn giản, với nhiều giao diện có thể) là có một lớp cơ sở cho cả các nhà trang trí và các lớp họ bao bọc, bất kể giao diện họ triển khai, có một phương thức được khai báo (sử dụng cú pháp của Java):

    public <T> T findImplementation (Class<T> cls) {
       if (cls.isAssignableFrom(getClass())
           return cls.cast(this);
      return wrapped.findImplementation (cls);
   }

Rõ ràng việc triển khai không trang trí trả về null thay vì chuyển yêu cầu, vì không có nơi nào để chuyển nó trong trường hợp này.


Giải pháp rất xen kẽ. (Cuối cùng tôi đã thêm một getWrappedInstance()phương thức vào hệ thống phân cấp loại của mình để làm một cái gì đó tương tự. Ước gì tôi đã nghĩ về điều này.)
billc.cn

1

Thách thức với giải pháp thay thế là nó làm cho việc thêm / thay đổi / loại bỏ các tính năng tùy chọn trở nên khó khăn hơn. Ví dụ: nếu chúng ta thêm một tính năng tùy chọn mới, bây giờ chúng ta phải thay đổi lớp cơ sở, sau đó thay đổi tất cả các lớp con để thêm tính năng hoặc tính năng không. Điều này có thể được giảm nhẹ nếu có mặc định hợp lý, chẳng hạn như không có op, vì vậy chỉ các kiểu con hỗ trợ tính năng cần ghi đè lên các phần cần thiết. Nếu các tính năng tùy chọn này ít, tương đối ổn định và không có khả năng thay đổi, chỉ cần thêm chúng vào siêu kiểu là đủ. Nếu không, sau đó bảo trì có thể bắt đầu khó sử dụng.

Mẫu thiết kế phổ biến nhất để phục hồi loại từ supertype là mẫu khách truy cập . Điều này có thể khó khăn trong tình huống của bạn vì một đối tượng có thể thực hiện nhiều giao diện, nhưng vẫn có thể thực hiện được với một số sửa đổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.