OOP: một số tình huống trong đó thiết kế dựa trên lớp tốt hơn so với giao diện dựa trên giao diện là gì?


9

Tôi đã đọc trang web của JDOM .

Tại sao API JDOM được định nghĩa theo các lớp cụ thể thay vì giao diện?

Jason Hunter tóm tắt các đối số chống lại API dựa trên giao diện cho JDOM:

Với các giao diện, mọi thứ trở thành một nhà máy, các yếu tố phải được 'nhập' vào các tài liệu mới thay vì chỉ được thêm vào, các tính năng như tuần tự hóa dài hạn không thể được đảm bảo và danh sách sẽ tiếp tục.

Chúng tôi bắt đầu với các giao diện thực sự. Trong quá trình xem xét trước khi phát hành cho một số đồng nghiệp, chúng tôi đã nhận được phản hồi, chúng tôi nên thử các lớp cụ thể. Chúng tôi đã làm, và thiết kế đã tốt hơn nhiều cho nó.

Tôi là một nhà thiết kế mới bắt đầu. Tất cả các lời khuyên tôi đã nghe về cho đến bây giờ là khuyên không nên sử dụng thiết kế với các lớp cụ thể.

Có thể được sử dụng các lớp bê tông là thích hợp ở những nơi nhất định. Có bất kỳ vấn đề lớp phổ biến nào mà sử dụng các lớp cụ thể trong thiết kế là ổn không?



Bạn cũng có thể xem loạt bài "Giới hạn sự trừu tượng của bạn": ayende.com/blog/153889/iêu
henginy

"Chúng tôi đã làm, và thiết kế đã tốt hơn nhiều cho nó." - thế nào là tốt hơn?
CodeART

Câu trả lời:


5
  • Kế thừa tạo ra sự phụ thuộc vào việc thực hiện , có thể là một vấn đề lớn liên quan đến khả năng bảo trì. Hệ quả của điều này là bạn có thể sử dụng các lớp kế thừa và cụ thể một cách an toàn khi xử lý đối tượng truyền dữ liệu , theo định nghĩa chứa hầu như không thực hiện. Bạn cũng có thể sử dụng kế thừa các lớp cụ thể khi bạn muốn phụ thuộc này. Bạn có thể muốn sử dụng một lớp trừu tượng chứa các phương thức phổ biến (thường là các hàm tiện ích) ở đầu phân cấp trong tình huống này.
  • Khi sử dụng hệ thống phân cấp lớp cụ thể, đừng quên áp dụng Nguyên tắc thay thế Liskov .
  • Không có vấn đề với việc sử dụng các lớp cụ thể cho các máy khách (tức là các lớp sử dụng, không phải các lớp được sử dụng).
  • IMHO bạn có thể sử dụng các lớp cụ thể cho đến khi có những thứ cần thay đổi. Các mở / Đóng Nguyên tắc sẽ cho bạn biết để sử dụng giao diện để tránh khớp nối, nhưng liên quan đến việc bạn không phải là Gonna Cần Nó Nguyên tắc bạn có thể cân nhắc sử dụng các lớp bê tông cho đến thời điểm này khi bạn cần một cái gì đó thay đổi trong việc thực hiện. Vấn đề là bạn sẽ phải thay đổi mọi khách hàng của lớp trong lần đầu tiên có gì đó thay đổi ở đâu đó. Trong khi bạn chỉ có một công cụ có thể để làm một cái gì đó, bạn có thể sử dụng các lớp cụ thể IMO.

[EDIT] Trang web của JDOM lấy java.io.File làm ví dụ, nhưng đây chắc chắn là một thiết kế dựa trên giao diện vì người ta có thể thao tác một cá thể java.io.File như thể nó chỉ là một serializable. Trong tình huống này, chỉ có "người sáng tạo" mới biết lớp cụ thể


Có hai định nghĩa mâu thuẫn về "đối tượng giá trị" trôi nổi xung quanh. Bạn dường như là một người ít phổ biến hơn, còn được gọi là "đối tượng truyền dữ liệu".
Michael Borgwardt

@MichaelBorgwardt Thx đã chỉ ra điều này vì tôi không chỉ có nghĩa là "đối tượng truyền dữ liệu": Tôi chỉnh sửa câu trả lời của mình
Matthias Jouan

1
LSP rất quan trọng đối với bất kỳ mối quan hệ phụ, thực hiện giao diện cũng như kế thừa.

2

Từ trang JDOM:

Jason (Hunter) đã thành lập dự án JDOM vào đầu năm 2000 cùng với Brett McLaughlin

Đó là, khoảng thời gian Java 1.3 được giới thiệu. Không có gì theo cách trưởng thành khi nói đến phát triển Java - các nhà phát triển có kinh nghiệm nhất chỉ có 4 năm sử dụng Java tốt nhất. Không có container IoC được sử dụng rộng rãi, không có Hibernate. Apache Struts mới chỉ bắt đầu.

Đó là tất cả để nói rằng Jason và Brett đã sai. Rất nhiều người đã không "hiểu được". Nếu họ có nền tảng C ++, thì bạn không cần giao diện trong C ++ (tốt, họ đã có trong C ++, nhưng bạn không thực sự cần chúng, phải không?), Tại sao quái vật lại sử dụng chúng trong Java? Vâng, có rất nhiều lý do tốt, mà những người khác có thể hướng bạn đến.

Họ chắc chắn đã sai về

bất cứ điều gì có thể được thực hiện với các giao diện đều có thể được thực hiện với phân lớp

Java không cho phép nhiều kế thừa của các lớp, nhưng nó cho phép thực hiện nhiều giao diện. Điều đó có thể tạo ra một sự khác biệt thực sự.


2

Trước tiên, hãy nhớ rằng trong Phát triển phần mềm, có một số cách để giải quyết vấn đề và nếu một số nhà phát triển sử dụng một kỹ thuật khác với bạn, điều đó không có nghĩa là sai.

Một trong những trường hợp đó là "lớp" so với (lớp) "lớp". Có những tình huống mà cùng một mục tiêu có thể đạt được với cả hai kỹ thuật.

Để làm cho mọi thứ, phức tạp hơn, có một số cách sử dụng giao diện, chỉ cần đề cập đến:

  • một là thiết kế một "hợp đồng" hoặc "đặc tả" mà không "thực hiện"
  • khác để thêm tính hợp lệ vào một lớp hoặc phân cấp các lớp hiện có
  • bổ sung cho trước đó, để cho phép chia sẻ quyền truy cập giữa các đối tượng, công nghệ khác nhau, ví dụ: Đậu doanh nghiệp, CORBA, COM, Dịch vụ web
  • thi đua nhiều kế thừa

Câu hỏi của bạn áp dụng cho điểm đầu tiên.

Khi bạn muốn phát triển một hệ thống phân cấp lớp, không chỉ một lớp và một vài lớp được dự định chia sẻ một số tính năng cụ thể, bạn có thể muốn bắt đầu với một lớp cơ sở, ngay cả khi nó có thể được thực hiện với giao diện.

Và, để lại giao diện cho các kịch bản khác.

Một ví dụ điển hình là các thư viện widget (điều khiển).

Tôi đề nghị, hãy xem các ngôn ngữ lập trình khác làm thế nào để họ sử dụng các giao diện & các lớp như: PHP, Delphi (Object Pascal), C #.

Chúc mừng.


0

Bạn thường muốn có một giao diện cho bất cứ thứ gì được truyền dưới dạng tham số hoặc được trả về, về cơ bản để bạn có thể tách lớp khỏi các phụ thuộc của nó.

Vì vậy, nếu chúng ta đang tìm kiếm một lớp học, chúng ta không bao giờ vượt qua được ngoại lệ thông thường. Tôi không phải là nhà phát triển Java, nhưng chắc chắn trong các ngôn ngữ tương tự khác, tôi không nghĩ rằng tôi đã thấy các giao diện được xác định cho các ngoại lệ.


0

Các quy tắc thiết kế API thực sự là một điều cụ thể. Tôi không chắc bạn nên kết luận bất cứ điều gì từ Câu hỏi thường gặp đó về cách bạn nên thiết kế mã hàng ngày của mình.

Đối với mã thông thường của bạn, vẫn đúng là bạn sẽ sử dụng giao diện hoặc kế thừa lớp trừu tượng thường xuyên hơn nhiều so với IMO kế thừa vanilla.

Để hiểu rõ về quy tắc đó, bạn phải đặt bản thân mình không phải từ quan điểm của một lớp dẫn xuất so với siêu lớp của nó, mà từ quan điểm của một đối tượng có sự phụ thuộc vào một đối tượng khác. Hầu như luôn luôn tốt hơn là phụ thuộc vào sự trừu tượng hơn là triển khai cụ thể vì nó cho phép bạn chấp nhận một loạt các lớp khác nhau làm phụ thuộc, dựa vào hợp đồng của họ chứ không phải chi tiết thực hiện.

Việc sử dụng đầu tiên cho việc này thường là trong các bài kiểm tra đơn vị - nếu bạn thực sự muốn kiểm tra đơn vị lớp của mình một cách hoàn toàn, bạn sẽ làm điều đó chống lại việc triển khai giả mạo các phụ thuộc của bạn khác với các triển khai thực tế sẽ được sử dụng trong sản xuất.

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.