2017-02-23 4 views
1

私は約8人の他の人と一緒にプロジェクトを進めており、他の人々がこのコードを今後何年も働いていることを考えれば、ここで最高のコード実践を知りたいと思っています。> =と<=を使用して列挙型の値を指定するのは良いコードですか?

は、私が10個の値を持つ列挙型を持っていると言う:

typedef enum { 
    Tag1 = 1, 
    Tag2, 
    Tag3, 
    Tag4, 
    Tag5, 
    Tag6, 
    Tag7, 
    Tag8, 
    Tag9, 
    Tag10 
} Tag; 

私はタグがTag6、Tag7、Tag8、Tag9、またはTag10に等しいかどうかを確認したい場合は、それは比較を使用することをお勧めしますlike:

if(myTag >= Tag6 && myTag <= Tag10) { 
    //Do something 
} 

ORを使用して各タグを確認するのが最適ですか?

> =と< =より使いやすく、落ち着きにくいですが、行がダウンすると、誰かがTag7とTag8の間に新しいTagを挿入すると、すべてのロジックが混乱します。

誰かが他のタグの間に新しいタグを追加しないと予想できますか?

+0

あなたはビットマスクの使用を検討しましたか? –

+0

私はこのコンセプトについて聞いたことがない、私はあなたにそれを見ていただきありがとうございます! – cpatmulloy

+0

Tag6、Tag7、Tag8、Tag9、またはTag10にあるタグの意義は何ですか?これらが優先レベルのようなものなら、あなたの現在のコードのロジックに7〜8のタグを追加する人が含まれているはずです。それらが異種で比類のない意味を持つ場合、追加のタグは現在のコードに含まれてはいけません(またはタグが追加されたときに考慮する必要があります)。あなたのif条件が何を意味するかによって異なります。また、列挙型のセマンティクスが明確に示されている場合、将来の開発者は新しいタグを追加するときにうまく行こうとします。 – Atreys

答えて

2

誰かが他のタグの間に新しいタグを追加しないと予想できますか?

私はそれに賭けません。列挙型の序数/基本値に固有の意味や順序がある場合を除き、私はそれらをあまり使用しないでください。

私が実際にの場合、誰かがすべてのチェックを適用せずに追加の列挙型を挿入できるようにするには、範囲チェックのみを使用します。これはおそらくかなりまれなケースです。 Keithは、優先度列挙型の良い例を示しています。もう一つの例はログレベルです。

正確な構文はもちろん、言語に依存しますが、私は通常、最も読みやすいこのような何かを検討します:

if(myTag in [Tag6, Tag7, Tag8]) { 
    // ... 
} 

それとも、より良い他のタグが何であるか、それは明らかにするいくつかの記述変数名を使用します:例えば、値のスケールを発現列挙するため

topTags = [Tag6, Tag7, Tag8] 

if(myTag in topTags) { 
    // ... 
} 
4

はい、しかしのみ

enum Priority { 
    None = 0, 
    Low, 
    Medium, 
    High, 
    Critical 
} 

次に、このコードは、理にかなって、読み取り可能である:

if(message.Priority >= Priority.Medium) { 
    // Notify user 
} 

列挙型は、このようなスケールを表現していない場合、彼らはかなり混乱することができますよう、その後<または>を使用しないでください。代わりにビットフラグを使用してください。

フラグ列挙型は、値を組み合わせることができるようにバイナリ値を使用する:

enum UserAudiences { 
    // Basic values: dec // binary 
    None   = 0, // 0000 
    Client   = 1, // 0001 
    Employee  = 2, // 0010 
    Contractor  = 4, // 0100 
    Key    = 8, // 1000 

    // Combined:  dec // binary 
    KeyClient  = 9, // 1001 : Key + Client   
    BoardMember  = 10, // 1010 : Key + Employee   
    CounterParty = 5, // 0101 : Client + Contractor 
    BusinessPartner = 13 // 1101 : Key + Client + Contractor 
} 

そして、我々は二進数を見複合列挙値に対して、適切なビットが設定されているかどうかをチェックします。私たちはUserAudiences.Employeeをチェックしたい場合は、インスタンスのために私達はちょうどそれが設定されているならば、我々はそれを含んで列挙型の値のいずれかを持って、2を表し、ビットを探すことができます。

if((message.Audience & UserAudiences.Employee) != 0) { 
    // Post on intranet 
} else { 
    // Send externally 
} 

そのビットを設定する方法はありませんKey,ClientまたはContractor列挙型の任意の組み合わせによって、Employeeが「ソース」列挙型の1つである場合にのみ設定できます。

ほとんどの言語は、このためにヘルパーを持っている(またはあなた自身を書くことができます):

if(message.Audience.HasFlag(UserAudiences.Employee)) { ... 

数学がどのベースで仕事ができる - あなたは小数で1、10、100、などを使用することができます。しかし、はるかに早く多くの数を必要とします。

最後に、通常の列挙型には単一の名前を使用し、フラグ付きの列挙型には複数の名前を使用して、等価性またはビット単位のチェックを使用するかどうかをプログラマに示唆します。

関連する問題