Một nhà phát triển đồng nghiệp đề nghị chúng tôi lưu trữ một số ngày trong tuần như chuỗi gồm 7 ký tự 1 và 0, tức là "1000100" cho Thứ Hai và Thứ Sáu. Tôi ưa thích (và mạnh mẽ đề xuất) một giải pháp với một hoạt động bit enum và bitwise, tôi nghĩ rằng đó là một cách sạch hơn để làm điều này, và nó sẽ được dễ dàng hơn để hiểu cho các nhà phát triển khác.Cờ enum & bitwise hoạt động so với "chuỗi bit"
[Flags()]
public enum Weekdays : int
{
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64
}
Tuy nhiên, khi tôi bắt đầu để thực hiện một giải pháp mẫu, tôi nhận ra rằng có lẽ cách tiếp cận chuỗi đơn giản là dễ dàng hơn sau khi tất cả: Chắc chắn là bit chuỗi là rõ ràng hơn “17” nếu bạn chỉ nhìn vào dữ liệu. Và tôi tìm ra C# Bitwise hoạt động phản trực giác và cực kỳ tiết:
Weekdays workDays = Weekdays.Monday | Weekdays.Tuesday;
if ((workDays & Weekdays.Monday) == Weekdays.Monday)
{...}
Tất nhiên điều này có thể được bao bọc độc đáo vào phương pháp khuyến nông, nhưng sau đó chúng tôi đột nhiên kết thúc với ít nhất cùng một số dòng mã như với chuỗi giải pháp, và tôi khó có thể tranh luận mã bitwise dễ đọc hơn.
Điều đó đang được nói, tôi vẫn sẽ đi với một cờ enum và bitwise hoạt động. Các lợi ích chính tôi có thể nghĩ đến là
- Hiệu suất tốt hơn
- Ít không gian cần thiết cho việc lưu trữ
Vì vậy, làm thế nào để bán các giải pháp Bitwise với các đồng nghiệp của tôi? Tôi có nên không? Những lợi ích khác của việc sử dụng phương pháp này trên dây là gì? Sau khi hoàn thành dự án mẫu, tôi thấy rằng nhóm vẫn chọn giải pháp dựa trên chuỗi. Tôi cần một số đối số tốt hơn/mạnh hơn. Tại sao bạn nên sử dụng Flags enums thay vì bit-string đơn giản?
Không giải quyết được câu hỏi của bạn, nhưng tại sao tạo ra enum của riêng bạn cho điều này khi đã có 'System.DayOfWeek'? –
Các giá trị enums System.DayOfWeek là 0 đến 6, không phải bội số của 2 (1, 2, 4, 8, 16, 32 và 64) mà tôi cần thực hiện các thao tác bitwise (AFAIK). Bên cạnh đó, MONDAY là ngày đầu tiên trong tuần. :) –
Để giảm tiết, bạn có thể viết: 'if ((workDays & Weekdays.Monday)! = 0)' –