2012-01-11 25 views
7

Tôi đã nhận thấy rằng tôi đã làm điều này không nhất quán trong cùng một dự án. Ở một số nơi, tôi sẽ có một enum với một tùy chọn ALL, và trong những người khác tôi sẽ có enum của tôi như là một loại nullable với một giá trị null cho thấy tất cả (hoặc không có bộ lọc.)TẤT CẢ hoặc không có enums?

Tôi nhận thấy nó khi tôi đã có để viết một cái gì đó như if (Region != null && Region != Regions.ALL).

Có lý do nào để đi theo cách này hay cách khác không?

+4

Tên gọi phải là UpperCamelCase – SLaks

+0

Tôi cảm thấy đó là vấn đề không phù hợp với trở ngại về đối tượng-quan hệ. Ở phía ứng dụng, có ý nghĩa để có các tùy chọn như "Tất cả", "Tất cả các vùng bờ biển phía Tây" và "Tất cả các vùng duyên hải phía đông". Tuy nhiên, tôi thường sử dụng enum được đúc thành int trực tiếp dưới dạng SqlParameter. Trong các phương thức này, tôi sẽ cần kiểm tra từng trường hợp này và chuyển đổi chúng thành SQL thích hợp. (Thay vì "và vùng = 1", tôi sẽ cần "và khu vực trong (2, 4, 5)"). Thật không may, SqlParameters không hoạt động tốt với các danh sách. – Serinus

Trả lời

2

đâu Enums mà bạn cần phải xác định một trong hai "Tất cả" hoặc "Null" loại, tôi thường đi với thuộc tính Flag và sử dụng Bitwise &|. Đó là một giải pháp linh hoạt hơn nhiều.

Như để tạo ra một loại nullable hoặc có một tùy chọn là "Tất cả", tôi nghĩ rằng nếu nó có ý nghĩa với bạn, sau đó tôi thấy không có vấn đề với nó. Tôi chỉ thích sử dụng Flags hơn.

+0

Thành viên 'Tất cả' cũng hữu ích cho' en Flags ''enums cũng ... không có quy tắc nào cho tất cả các cờ phải loại trừ lẫn nhau. –

+0

@BenVoigt - hoàn toàn. Khi tôi có các loại kết hợp thường xuyên này, tôi sẽ thực hiện một 'Tất cả = 0x111' hoặc bất kỳ thứ gì. Bạn cũng có thể làm một cái gì đó như 'PizzaAndBreadsticks = 0x101' nếu đó là một combo thường xuyên mà bạn muốn có một định nghĩa rõ ràng cho. –

7

Sử dụng Regions.All rõ ràng hơn khi truyền tải ý nghĩa. Bạn có thể "gán" ý nghĩa đó cho null và máy tính sẽ ổn với nó. Tuy nhiên, trình đọc của chương trình sẽ cần phải giải mã ý nghĩa từ cách bạn sử dụng giá trị enum null hoặc đọc nhận xét của bạn. Regions.All, mặt khác, là tự ghi chép và tự giải thích.

2

Nói chung, chúng tôi sử dụng null để có nghĩa là 'không xác định' hoặc 'không tồn tại' hoặc 'không áp dụng'. Vì vậy, trong trường hợp của một bộ lọc, nó có ý nghĩa để cho phép null, bởi vì nó có nghĩa là 'không lọc'.

Bên cạnh đó, một enum gọi Regions có thể có giá trị như Northeast, Southeast, Midwest, Southwest, và West. Bây giờ, xin vui lòng sửa tôi nếu tôi sai, nhưng tôi không nghĩ rằng có bất kỳ khu vực được gọi là "Tất cả" ở Mỹ. Trong thời gian tôi ở lại lâu năm, tôi nghe người thời tiết trên TV nói về thời tiết ở phương Tây, và thời tiết ở Đông Nam, vv nhưng không bao giờ có thời tiết ở một nơi gọi là "Tất cả". Vì vậy, tôi nghiêng để tin rằng không có khu vực như vậy. Vì vậy, bao gồm "Tất cả" trong một enum của khu vực là một hack. Đột nhiên, các en232 Regions không phải là về khu vực; thay vào đó là về các vùng và/hoặc lọc chúng. Những thay đổi về ý nghĩa của loại này là một cái gì đó để nhận thức được trong lập trình và nói chung là tránh.

+0

Tôi không đồng ý với việc gán null cho một biến enum. Không mất gì để tạo ra một giá trị 'None' hoặc' All' mô tả một cách hoàn hảo 'null' thực sự có nghĩa gì trong ngữ cảnh này. –

+0

@ Hand-E-Food Vâng, tất nhiên là không mất gì cả. Và sau đó bạn có một danh sách các đối tượng 'quản lý khu vực' mỗi đối tượng có một vùng 'khu vực' và hoàn toàn hợp lệ để có người quản lý khu vực quản lý một khu vực có tên là 'Không' hoặc khu vực có tên 'Bất kỳ'.Xin chúc mừng, bạn vừa mới hãm hiếp nguyên tắc toàn vẹn dữ liệu cơ bản. –

+0

Tôi thấy quan điểm của bạn bây giờ là việc thêm các thành viên riêng biệt vào những gì phải là một liệt kê riêng biệt là không nhất quán. Một cái gì đó không ngồi với tôi bằng cách sử dụng 'null', nhưng nó đã cho tôi suy nghĩ. –

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