2010-04-21 28 views
6

Hôm nay tôi đã đi đến một nghịch lý cơ bản của phong cách lập trình đối tượng, các loại bê tông hoặc giao diện.Loại bê tông hoặc Giao diện cho loại trả lại?

Làm cách nào tốt hơn cho loại trả về của phương thức: loại bê tông hoặc giao diện?

Trong hầu hết các trường hợp, tôi có xu hướng sử dụng các loại cụ thể làm kiểu trả về cho các phương thức. bởi vì tôi tin rằng một loại cụ thể là linh hoạt hơn để sử dụng thêm và cho thấy nhiều chức năng hơn.

Mặt tối của điều này: Khớp nối. Thiên thần: Một loại bê tông chứa giao diện bạn sẽ quay trở lại ban đầu và thêm chức năng.

Quy tắc ngón tay cái của bạn là gì?

Có nguyên tắc lập trình nào cho điều này không?


THƯỞNG: Đây là một ví dụ về những gì tôi có nghĩa ReadOnlyCollection or IEnumerable for exposing member collections?

Trả lời

4

quy tắc của ngón tay cái:

1) Ban đầu, tôi có phương pháp trả về kiểu giao diện, bởi vì nó luôn luôn dễ dàng để thay đổi nó để loại bê tông sau này nếu cần thiết. Khó hơn để quay trở lại theo cách khác.

2) Ngay cả khi phương pháp này được khai báo để trả lại kiểu dữ liệu cụ, tôi sẽ mã người gọi sử dụng các loại giao diện bất cứ khi nào có thể:
InterfaceType i = xyz.methodThatReturnsConcreteType();.

3) Cho dù tôi sở hữu mã gọi điện thoại làm cho một sự khác biệt quá (nội vs các API công cộng):

  • Nếu tôi sở hữu mã mà các cuộc gọi phương pháp trong câu hỏi (ví dụ: API nội bộ), thì sẵn sàng Tôi sẽ trả lại loại bê tông.
  • Nếu tôi không kiểm soát mã gọi phương thức này (ví dụ: API công khai), tôi có nhiều khả năng trả lại loại giao diện thay thế. Trả lại loại bê tông là một cam kết và nói chung, tôi càng hứa, càng dễ dàng.

cân nhắc khác:

  • kiểm tra có thể được dễ dàng hơn với giao diện kể từ khi tôi có thể sử dụng một đối tượng giả mà thực hiện giao diện.
  • Có một cơ hội bên ngoài mà tôi muốn trả lại một proxy object (bây giờ tôi đang thực sự đạt cho lời xin lỗi)

Nói tóm lại,

  • Tôi thường trả về kiểu giao diện bởi vì tôi cảm thấy những lợi ích của khớp nối lỏng lẻo lớn hơn sự tiện lợi của việc tiếp cận đầy đủ với loại bê tông.
  • Tuy nhiên, tôi không phản đối việc chuyển sang trả lại loại bê tông trên cơ sở từng trường hợp bất cứ khi nào thuận tiện vượt quá lợi ích của khớp nối lỏng lẻo.
7

Rule of thumb, trong các loại trở lại, là một càng cụ thể càng tốt, trong các loại tham số như unspecific càng tốt. Cũng thích giao diện, vì sau này bạn có thể trao đổi việc triển khai của bạn nếu cần, mà không thay đổi các khách hàng của API của bạn.

+0

Cảm ơn ý kiến ​​của bạn Dominik +1 – SDReyes

+0

Một 'MyCustomExtendedArrayList' cụ thể hơn' Danh sách'. Bạn sẽ trở lại cái gì? – BalusC

+2

@BalusC: Phụ thuộc vào việc triển khai Danh sách khác hoặc cung cấp một số phương thức tùy chỉnh. Sẽ có ý nghĩa gì khi trả lại một lớp chuyên biệt, nếu nó chỉ có thể được sử dụng bằng cách đúc? – Dominik

1

Câu hỏi thú vị. Tôi tin rằng bạn phải tự hỏi mình làm cách nào để dữ liệu trả lại được sử dụng. Sử dụng tương tự xe cũ tương tự nếu bạn có

public AccelerationResponse PressAccelerator(float force) {} 

Rất có thể bạn muốn trả lại giao diện thay vì một lớp học. Bạn có thể giải thích phản hồi này một cách khác nhau tùy thuộc vào các điều kiện nhất định.

Nếu bạn được đảm bảo rằng lợi nhuận của bạn chỉ có thể được sử dụng theo cách dự kiến ​​sẽ được thực hiện cụ thể thì sử dụng lớp đó có ý nghĩa. Tôi không chắc chắn về bất kỳ nguyên tắc được chấp nhận rộng rãi nào nhưng quy tắc chung của tôi là nếu kiểu trả về có thể được tái sử dụng trong các triển khai khác nhau, một giao diện có ý nghĩa hơn.

+0

Cảm ơn bạn Jeremy, đặc biệt cho "... nếu kiểu trả về có thể được tái sử dụng trong các triển khai khác nhau, một giao diện có ý nghĩa hơn" phần +1 – SDReyes

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