2012-01-11 14 views
7

私はこれが同じプロジェクト内で矛盾していることに気付きました。いくつかの場所では、ALLオプション付きの列挙型を使用します。その他の場合は、列挙型をnull値ですべての(またはフィルタなし)を示すnullable型にします。ALLかenumsでヌルですか?

私は気付いたときにif (Region != null && Region != Regions.ALL)のようなものを書く。

どちらか一方の理由がありますか?

+4

Enumの名前はUpperCamelCaseである必要があります – SLaks

+0

オブジェクトリレーショナルのインピーダンスのミスマッチの問題だと思います。アプリケーション側では、「すべて」「すべての西海岸地域」「すべての東海岸地域」のようなオプションを持つことが理にかなっています。 しかし、私はしばしば列挙型を直接SqlParameterとしてintにキャストしています。これらのメソッドでは、これらのインスタンスをそれぞれ確認し、適切なSQLに変換する必要があります。 ( "and region = 1"の代わりに "and(2、4、5)in region"が必要です)。残念ながら、SqlParametersはリストでもうまく動作しません。 – Serinus

答えて

2

「すべて」または「Null」のいずれかのタイプを指定する必要がある列挙型では、通常Flag属性を使用し、ビット単位で&|を使用します。それははるかに柔軟な解決策です。

null可能な型を作成する場合、または1つのオプションを「すべて」にする場合は、それがあなたに合っていれば問題はありません。私はただフラグを使用することを好む。

+0

'All'メンバは' [Flags] 'enumsにも便利です...すべてのフラグは相互に排他的でなければならないというルールはありません。 –

+0

@BenVoigt - 完全に。私はこれらの種類の頻繁な組み合わせがあるとき、 'All = 0x111'などを行います。明示的な定義が必要な頻繁なコンボであれば、 'PizzaAndBreadsticks = 0x101'のようなこともできます。 –

7

Regions.Allを使用すると、意味を伝える限り、より明示的になります。あなたはその意味をnullに "割り当てる"ことができ、コンピュータはそれで問題ないでしょう。しかし、プログラムの読者は、null enum値を使用する方法から、またはコメントを読むことからその意味を解読する必要があります。一方、Regions.Allは、自己文書化であり、自明である。

2

一般に、nullは、「不特定」または「存在しない」または「適用外」を意味するために使用されます。したがって、フィルタの場合は、「フィルタリングなし」を意味するため、nullを許可することは理にかなっています。また

、列挙型はNortheastSoutheastMidwestSouthwest、およびWestのような値を持っている、おそらくRegionsと呼ばれます。私が間違っていたら私を修正してください。しかし、私はアメリカに "All"と呼ばれる地域はないと思います。私は何年にもわたって長期滞在していましたが、西洋の天気や南東の天気などテレビの天気予報を聞いたことがあります。だから、私はそのような地域がないと信じる傾向があります。したがって、領域の列挙型に「すべて」を含めることはハックです。突然、Regions列挙型は領域に関するものではありません。その代わりに領域および/またはそのフィルタリングに関するものである。この種の意味の変化は、プログラミングにおいて気づいて、一般的に避けるべきことです。

+0

私はenum変数にnullを割り当てることに同意しません。この文脈では 'null 'が実際に何を意味するかを完全に記述する' None'または 'All'の値を作ることは何もしません。 –

+0

@ Hand-E-Foodはい、もちろん何もしません。そして、あなたは '地域マネージャ'オブジェクトのリストを持っています。それぞれに '地域'フィールドがあり、 'なし'または 'Any'という地域を管理する地域マネージャを持つことは完全に有効です。おめでとう、あなたは基本的なデータの完全性の原理をレイプしました。 –

+0

離散列挙型でなければならないものに無差別なメンバーを追加するのは矛盾しているので、今、あなたの要点を見ています。何かが「ヌル」を使って私と一緒に座っていませんが、それは私には思っています。 –

関連する問題