it-swarm-vi.com

Có phải là một thực tế xấu khi có một giao diện để xác định các hằng số?

Tôi đang viết một tập hợp các lớp kiểm tra Junit trong Java. Có một số hằng, ví dụ các chuỗi mà tôi sẽ cần trong các lớp kiểm tra khác nhau. Tôi đang suy nghĩ về một giao diện xác định chúng và mọi lớp kiểm tra sẽ thực hiện nó.

Những lợi ích tôi thấy có:

  • dễ dàng truy cập vào hằng số: MY_CONSTANT thay vì ThatClass.MY_CONSTANT
  • mỗi hằng số chỉ được xác định một lần

Cách tiếp cận này là một thực hành tốt hay xấu? Tôi cảm thấy như vậy là giống như lạm dụng khái niệm giao diện.

Bạn có thể trả lời chung về các giao diện/hằng, nhưng cũng về các bài kiểm tra đơn vị nếu có điều gì đó đặc biệt về nó.

45
FabianB

Joshua Bloch khuyên chống lại điều này trong cuốn sách của mình có tiêu đề Java hiệu quả:

Một lớp sử dụng một số hằng số bên trong là một chi tiết triển khai. Việc triển khai một giao diện không đổi khiến chi tiết triển khai này bị rò rỉ vào API đã xuất của các lớp. Không có hậu quả gì đối với người dùng của một lớp mà lớp thực hiện một giao diện không đổi. Trong thực tế, nó thậm chí có thể nhầm lẫn họ. Tồi tệ hơn, nó thể hiện một cam kết: nếu trong một bản phát hành trong tương lai, lớp được sửa đổi để nó không còn cần sử dụng các hằng số, thì nó vẫn phải thực hiện giao diện để đảm bảo khả năng tương thích nhị phân.

Bạn có thể nhận được hiệu ứng tương tự với một lớp bình thường xác định các hằng số, sau đó sử dụng import static com.example.Constants.*;

88
matt

Trong trường hợp của chúng tôi, chúng tôi đang làm điều này bởi vì các giá trị của các hằng số thể hiện một hợp đồng cho các trạng thái kết thúc mà việc triển khai dịch vụ là bắt buộc để cung cấp. Đặt các hằng số này trong giao diện chỉ định các trạng thái kết thúc như là một phần của hợp đồng và nếu bất kỳ triển khai nào của giao diện không sử dụng chúng, thì nó sẽ không hoạt động.

Các hằng số SOMETIMES là chi tiết thực hiện. Họ không phải là họ. Như thường lệ, một kỹ sư cần sử dụng bộ não của mình để quyết định phải làm gì và không dựa vào mô hình quét hoặc thực hành.

14
user144901

Tôi không nghĩ rằng đó là một điều tốt để có giao diện chỉ cho các hằng số.

Nhưng nếu một giao diện xác định hành vi (các phương thức triển khai các lớp nên thực hiện), có các hằng số thì không sao. Nếu nó "rò rỉ chi tiết của người triển khai" vào API, thì đó là vì nó phải như vậy. Họ cũng đang rò rỉ rằng người triển khai thực hiện các phương thức .foo().bar().

Lấy ví dụ giao diện Java.awt.Transparency. Nó có các hằng số OPAQUE, BITMASKTRANSLUCENT nhưng cũng có phương thức .getTransparency().

Nếu nhà thiết kế đặt các hằng số đó ở đó bởi vì anh ấy/cô ấy nghĩ rằng nó sẽ đủ ổn định để trở thành một phần của giao diện, như là .getTransparency().

6
Tulains Córdova

Một công ty tôi làm việc đã sử dụng rất nhiều giao diện nhập khẩu1 hằng số. Tôi không cảm thấy bất kỳ tác hại nào đến từ nó.

Câu hỏi bạn nên tự hỏi mình là, tầm quan trọng của việc đặt tên cho bạn như thế nào? Trong trường hợp các hằng số, đó thực sự là tất cả một lớp hoạt động như. Nếu bạn có hàng ngàn hằng số, bạn có thể không muốn tất cả các hằng số đó luôn có sẵn.

Điều thú vị về giao diện là nó mang lại cho bạn lợi ích khi làm việc theo bất kỳ cách nào - mang lại tất cả các không gian tên bạn cần hoặc không có giao diện nào (và truy cập chúng một cách rõ ràng, với MyInterface.CONSTANT). Khá nhiều thứ giống như import static MyInterface.*, nhưng rõ ràng hơn một chút.


1: Nếu bạn không quen thuộc với Java, tôi không có nghĩa là từ khóa import, tôi chỉ có nghĩa là được đưa vào thông qua implements MyConstantsInterface

2
Nicole

Hãy nghĩ rằng đó là một quan điểm chủ yếu phổ biến ở những nơi mà thiết kế theo hợp đồng là phổ biến.
[.__.] Giao diện là hợp đồng. Đặt các hằng số trong các giao diện có nghĩa là mọi lớp tuân theo hợp đồng đều đồng ý với giá trị/khái niệm được xác định bởi hằng số.

2
CMR

Không, đó không phải là một thực hành xấu chung.

Vấn đề là các hằng số như bất kỳ vật phẩm nào khác phải được giới thiệu theo các quy tắc về tầm nhìn tối thiểu và mức độ trừu tượng thích hợp.

Sử dụng cú pháp chỉ bởi vì bạn có thể là vấn đề thực sự.

1
oopexpert

Tôi đến từ một nền tảng chủ yếu bị ảnh hưởng chủ yếu bởi 'cách Ada' và '.Net cách.' Tôi sẽ nói không, có lẽ không phải là tốt nhất để khai báo hằng trong các giao diện. Đó là kỹ thuật không được phép trong c #.

Lý do tôi nói không là giao diện là một dạng hợp đồng xác định hành vi, không phải trạng thái hoặc cấu trúc. Một hằng số ngụ ý một số loại trạng thái (nguyên thủy), hoặc một khía cạnh của trạng thái (tổng hợp hoặc tổng hợp).

Tôi có thể đánh giá cao sự thôi thúc đưa ra các giá trị mặc định và các giá trị được xác định trước cho mọi người thực hiện giao diện, nhưng có lẽ trạng thái mặc định sẽ được mô tả tốt hơn trong một đối tượng hoặc mẫu trừu tượng hoặc giá trị, trong đó các giá trị mặc định sẽ có ít nhất là bối cảnh tối thiểu.

Để có hướng dẫn kỹ thuật hơn: download.Oracle.com/javase/1.5.0/docs/guide/lingu/static-import.html

1
JustinC