Có ổn không khi các giao diện phụ thuộc vào các lớp cụ thể?


9

Tôi đang tạo giao diện trong Java để xử lý lỗi tùy chỉnh.

Muốn vượt qua một đối tượng lỗi đối số nhưng tôi cần nó là con của Exceptionlớp.

Có thể sử dụng tên lớp được xác định của tôi trong một giao diện không?

Nó sẽ làm cho nó ít giao diện hơn trong điều kiện không bị phụ thuộc vào bất kỳ triển khai nào?

Tôi cố gắng làm một cái gì đó như thế này:

public class CustomException {
    /* ... Implementation ... */
}

public interface Interface {

    void onError(CustomException ex);

}

Bạn đang cố gắng hỏi liệu có ổn không khi kế thừa một lớp khác trong một giao diện?
Snoop

@StevieV Không. Tôi đã chỉnh sửa câu hỏi.
nikachx

1
@AresresF. Đây chỉ là một ví dụ và có thể được áp dụng cho bất kỳ ngôn ngữ OO nào về việc sử dụng các lớp trong giao diện.
nikachx

3
Hãy cho tôi biết: là CustomExceptionmột phần của việc thực hiện hay một phần của giao diện?
dùng253751

2
@nikachx Tôi không hiểu ý của bạn là "an toàn". Trong những cách Stringan toàn hơn CustomException? Tại sao nó lại quan trọng nếu CustomException, đến lượt nó, có sự phụ thuộc khác?
Andres F.

Câu trả lời:


2

Đầu tiên tôi phải chỉ ra một thực tế là CustomExceptionnó không mở rộng Exceptionnên nó không thực sự là một Exception.

Mà nói:

Nếu bạn không quan tâm đến Nguyên tắc đảo ngược phụ thuộc , thì hãy để nguyên như vậy. Hoàn toàn ổn khi giao diện phụ thuộc vào các lớp cụ thể, ví dụ: nhiều giao diện phụ thuộc vào Stringhoặc Objectđó là các lớp cụ thể . Vấn đề là chúng ta có xu hướng tin rằng các lớp thuộc về SDK Java ổn định hơn (ít bị thay đổi vi phạm mã hơn) so với các lớp chúng ta viết.

Mặt khác:

Nếu bạn muốn làm theo DIP (có vô số lợi ích và là khuyến nghị của tôi), thì bạn phải thực hiện một trong hai điều sau:

lựa chọn 1

  • Làm cho CustomExceptiontrừu tượng
  • Giữ void onError(CustomException ex)vì nó là

Lựa chọn 2

  • Tạo CustomExceptiongiao diện
  • Giữ void onError(CustomException ex)vì nó là

Với một trong các tùy chọn đó, bạn sẽ tuân thủ DIP, vì giao diện sẽ không phụ thuộc vào bất kỳ lớp cụ thể nào, chỉ dựa trên trừu tượng.

Trong một ứng dụng trực tiếp của nghịch đảo phụ thuộc, các tóm tắt được sở hữu bởi các lớp trên / chính sách. Kiến trúc này nhóm các thành phần chính sách / cao hơn và các tóm tắt xác định các dịch vụ thấp hơn cùng nhau trong cùng một gói. Các lớp cấp thấp hơn được tạo bởi sự kế thừa / thực hiện các lớp hoặc giao diện trừu tượng này . Martin, Robert C. (2003).

  • Phát triển phần mềm, nguyên tắc,> mô hình và thực tiễn. Hội trường Prentice. trang 127 đỉnh131. Sê-ri 980-0135974445.

1
Không có nhiều sự khác biệt giữa việc chấp nhận một lớp trừu tượng hoặc một lớp cụ thể (không phải là cuối cùng) và sự khác biệt đối với một giao diện không nhiều hơn thế. Miễn là cá thể được truyền dưới dạng tham số và không được mã hóa cứng trong triển khai của bạn, bạn có nền tảng cho DI.
Jacob Raihle

@JacobRaihle Ý bạn là gì khi truyền một thể hiện được mã hóa cứng trong quá trình thực hiện?
Tulains Córdova

Tôi nói "miễn là nó được thông qua và không được mã hóa cứng". Ý tôi là vì Interfacegiao diện chấp nhận a CustomExceptionvà giao cho người gọi cung cấp một cái, người gọi có thể tự do cung cấp bất kỳ lớp nào mở rộng CustomExceptionngay cả khi CustomExceptionlà một lớp cụ thể - điều mà không thể có được nếu có Interfacetrách nhiệm tạo ra nó Sự đảo ngược của điều khiển, moreso hơn là làm việc với các giao diện (mặc dù điều đó chắc chắn có ích), là những gì tôi nghĩ DI là tất cả về.
Jacob Raihle

@JacobRaihle "Trong một ứng dụng trực tiếp của nghịch đảo phụ thuộc, các tóm tắt được sở hữu bởi các lớp chính sách / trên. Kiến trúc này nhóm các thành phần chính sách / cao hơn và các tóm tắt xác định các dịch vụ thấp hơn trong cùng một gói. Các lớp cấp thấp hơn được tạo bằng cách kế thừa / thực hiện các lớp hoặc giao diện trừu tượng này . " Martin, Robert C. (2003). Phát triển phần mềm, nguyên tắc, mô hình và thực tiễn của Agile. Hội trường Prentice. trang 127 đỉnh131. Sê-ri 980-0135974445.
Tulains Córdova

Điểm của một lớp trừu tượng là gì nếu bạn có thể cung cấp một mặc định hợp lý? Bạn mất gì khi cung cấp điều đó? Đừng chỉ trích dẫn sách, hãy suy nghĩ.
Jacob Raihle

2

Tulains là đúng - giao diện phụ thuộc vào các lớp cụ thể mọi lúc. Họ chỉ có nghĩa là để tạo ra một hợp đồng cho mối quan tâm riêng của họ. Hợp đồng đó có thể liên quan đến việc lấy và trả lại bất kỳ loại dữ liệu nào.

Hãy nhớ rằng trong các ngôn ngữ cấp cao hơn, ngay cả các loại nguyên thủy cũng không quá nguyên thủy. Vì vậy, dù sao bạn cũng đang làm việc với các loại bê tông!


0

Tôi cho rằng theo tên , bạn có nghĩa là lớp thực tế. Nếu bạn đang cố gắng chỉ định tên lớp ngoại lệ thực tế để khởi tạo ngoại lệ tương ứng thông qua Reflection, đây không phải là cách phù hợp.

Nếu bạn muốn sử dụng một lớp tùy chỉnh trong một giao diện, tất nhiên, bạn có thể sử dụng các lớp của riêng bạn trong các giao diện của riêng bạn. Các lớp trở thành một phần của giao diện chung của thư viện / API của bạn. Các cấu trúc dữ liệu và ngoại lệ là một ví dụ tốt về các lớp thường được sử dụng bởi các giao diện.

Nếu bạn cần sử dụng các ngoại lệ khác nhau tùy thuộc vào ngữ cảnh, thì bạn có thể quan tâm đến việc sử dụng thuốc generic.


Không, tôi không có ý phản ánh. Có như bạn đề cập Ngoại lệ và cấu trúc dữ liệu có thể được sử dụng trong các giao diện vì chúng chỉ chứa dữ liệu và không phải là nền tảng hoặc phụ thuộc vào các lớp khác. Cảm ơn bạn.
nikachx

2
Câu trả lời đặt câu hỏi cho OP ... Chỉ cần hỏi trong một nhận xét, sau đó cung cấp câu trả lời của bạn.
Snoop

1
@StevieV: Đoạn đầu tiên là một câu hỏi tu từ. Và như thể hiện bởi nhận xét của OP, tôi thực sự đã trả lời câu hỏi của OP.
Arseni Mourzenko
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.