2011-10-26 37 views
7

Tôi nhận được một số trường bit từ phần cứng.Ưu và khuyết điểm của việc sử dụng cờ enum là gì?

Mã của tôi ban đầu:

public readonly byte LowByte; 

public bool Timer { get { return (LowByte & 1) == 1; } } 

Sau đó, tôi nhớ đến những lá cờ enum và đang xem xét thay đổi nó để:

[Flags] 
public enum LowByteReasonValues : byte 
{ 
    Timer = 1, 
    DistanceTravelledExceeded = 2, 
    Polled = 4, 
    GeofenceEvent = 8, 
    PanicSwitchActivated = 16, 
    ExternalInputEvent = 32, 
    JourneyStart = 64, 
    JourneyStop = 128 
} 

public readonly LowByteReasonValues LowByte; 

public bool Timer { get { return (LowByte & LowByteReasonValues.Timer) == LowByteReasonValues.Timer; } } 

và vân vân.

Phương pháp nào là thực tiễn tốt nhất và điều gì sẽ xảy ra nếu có bất kỳ ưu và nhược điểm nào của mỗi phương pháp tiếp cận?

EDIT: Tôi muốn biết liệu có bất kỳ khác biệt thực tế nào giữa hai cách tiếp cận, đặc biệt là về hiệu suất hay không. Tôi không muốn thu hút ý kiến ​​về các kiểu mã hóa (trừ khi nó xuất phát từ các nguyên tắc của Microsoft) vì điều đó sẽ thấy câu hỏi được đóng là không có cấu trúc. Cảm ơn.

+0

Hãy thử xem xét từ quan điểm của nhà phát triển đang sử dụng mã này. Viết đơn vị kiểm tra là một cách tốt để làm điều đó; các ví dụ viết (mẫu mã) là một ví dụ khác. Cách nào cho phép nhà phát triển viết mã rõ ràng nhất? Cách nào sẽ trực quan nhất cho nhà phát triển ứng dụng khách? – TrueWill

Trả lời

1

Ít nhất, ví dụ thứ hai của bạn có ngữ nghĩa tốt hơn và chỉ ra ý nghĩa của các bit trong mã. Có một số tài liệu trong mã của những gì bit được sử dụng cho. Nếu không, dựa trên ví dụ đầu tiên của bạn, bạn sẽ cần phải thêm bình luận vì bạn về cơ bản có số ma thuật (bit), khiến mã khó đọc hơn, đặc biệt là bởi một người khác không quen với nó. Ngay cả khi bản thân bạn sẽ duy trì mã này sáu tháng xuống đường, bạn có thể thấy khó nhớ những gì bit 5 được sử dụng cho.

5

này sau đó là thực hành tốt nhất kể từ khi nó làm cho mã của bạn dễ đọc hơn

4

Nếu bạn đang sử dụng .NET 4.0, bây giờ bạn có thể sử dụng phương thức HasFlag để kiểm tra xem một enum có chứa một bit cụ thể hay không. Điều này làm cho nó dễ đọc hơn so với phương pháp kiểm tra trước đó.

[Flags] 
public enum LowByteReasonValues : byte 
{ 
    Timer = 1, 
    DistanceTravelledExceeded = 2, 
    Polled = 4, 
    GeofenceEvent = 8, 
    PanicSwitchActivated = 16, 
    ExternalInputEvent = 32, 
    JourneyStart = 64, 
    JourneyStop = 128 
} 

public readonly LowByteReasonValues LowByte; 

public bool Timer 
{ 
    get 
    { 
    return (LowByte.HasFlag(LowByte.Timer)); 
    } 
} 

Thông tin thêm về MSDN.

+0

Ooh ... cảm ơn. Tôi đang sử dụng .NET 4.0 nhưng chức năng đó đã không đi vào radar của tôi trước đây. –

+0

Thật không may nó sẽ xuất hiện (từ một bình luận người dùng trên trang MSDN ít nhất) rằng nó khá chậm. Xấu hổ! –

+0

@StephenKennedy: Lưu ý, nhưng tôi sẽ chỉ lo lắng về nó nếu nó bắt đầu gây ra vấn đề và mã của bạn là cực kỳ hiệu suất quan trọng. Không cần phải sớm tối ưu hóa bất cứ điều gì. –

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