Tôi nghĩ rằng sự khác biệt giữa tốt và tốt là đủ .
Mặc dù trong hầu hết các trường hợp, bạn có thể tránh việc sử dụng hằng số bằng cách triển khai các mẫu khác (chiến lược hoặc có thể là hạng cân), nhưng có điều cần nói là không cần đến nửa tá lớp khác để đại diện cho một khái niệm. Tôi nghĩ những gì nó tóm tắt lại là khả năng cần các hằng số khác. Nói cách khác, có cần phải mở rộng ENUM được cung cấp bởi các hằng số trên giao diện hay không. Nếu bạn có thể thấy trước cần phải mở rộng nó, thì hãy chọn một mẫu trang trọng hơn. Nếu không, thì nó có thể đủ (nó sẽ đủ tốt và do đó ít mã hơn để viết và kiểm tra). Đây là một ví dụ về việc sử dụng đủ tốt và không tốt:
Xấu:
interface User {
const TYPE_ADMINISTRATOR = 1;
const TYPE_USER = 2;
const TYPE_GUEST = 3;
}
Đủ tốt:
interface HTTPRequest_1_1 {
const TYPE_CONNECT = 'connect';
const TYPE_DELETE = 'delete';
const TYPE_GET = 'get';
const TYPE_HEAD = 'head';
const TYPE_OPTIONS = 'options';
const TYPE_POST = 'post';
const TYPE_PUT = 'put';
public function getType();
}
Bây giờ, lý do mà tôi chọn những ví dụ đó rất đơn giản. Các User
giao diện được xác định một enum các loại người dùng. Điều này rất có thể mở rộng theo thời gian và sẽ phù hợp hơn với một mẫu khác. Nhưng đây HTTPRequest_1_1
là một trường hợp sử dụng tốt, vì enum được định nghĩa bởi RFC2616 và sẽ không thay đổi trong suốt thời gian tồn tại của lớp.
Nói chung, tôi không thấy vấn đề với hằng số và hằng số lớp là một vấn đề toàn cầu . Tôi xem nó như một vấn đề phụ thuộc. Đó là một sự khác biệt hẹp, nhưng là một sự phân biệt rõ ràng. Tôi thấy các vấn đề toàn cầu như trong các biến toàn cục không được thực thi và như vậy tạo ra một sự phụ thuộc toàn cầu mềm. Nhưng một lớp được mã hóa cứng tạo ra một sự phụ thuộc được thực thi và như vậy tạo ra một sự phụ thuộc toàn cục cứng. Vì vậy, cả hai đều là phụ thuộc. Nhưng tôi cho rằng toàn cầu còn tệ hơn nhiều vì nó không được thực thi ... Đó là lý do tại sao tôi không thích gộp các phụ thuộc lớp với các phụ thuộc toàn cục dưới cùng một biểu ngữ ...
Nếu bạn viết MyClass::FOO
, bạn đã được mã hóa các chi tiết triển khai của MyClass
. Điều này tạo ra một khớp nối cứng, làm cho mã của bạn kém linh hoạt hơn, và điều này nên tránh. Tuy nhiên, các giao diện tồn tại để cho phép chính xác loại khớp nối này. Do đó MyInterface::FOO
không giới thiệu bất kỳ khớp nối bê tông nào. Với điều đó đã nói, tôi sẽ không giới thiệu một giao diện chỉ để thêm một hằng số vào nó.
Vì vậy, nếu bạn đang sử dụng giao diện và bạn rất chắc chắn rằng bạn (hoặc bất kỳ ai khác về vấn đề đó) sẽ không cần các giá trị bổ sung, thì tôi thực sự không thấy vấn đề lớn với các hằng số giao diện ... thiết kế sẽ không bao gồm bất kỳ hằng số hoặc điều kiện hoặc số ma thuật hoặc chuỗi ma thuật hoặc bất kỳ thứ gì được mã hóa cứng. Tuy nhiên, điều đó làm tăng thêm thời gian để phát triển, vì bạn phải xem xét việc sử dụng. Quan điểm của tôi là hầu hết thời gian hoàn toàn xứng đáng để dành thêm thời gian để xây dựng một thiết kế vững chắc tuyệt vời. Nhưng có những lúc đủ tốt thực sự có thể chấp nhận được (và cần một nhà phát triển có kinh nghiệm để hiểu được sự khác biệt), và trong những trường hợp đó, nó vẫn ổn.
Một lần nữa, đó chỉ là quan điểm của tôi về nó ...