一般に、特定の列挙型をパラメーターとして受け取る単一の型または名前空間があることがわかりました。その結果、私は常にそれらの列挙型をそこで定義してきました。しかし最近、私は同僚にそれがどのように愚かなことであるかについて大したことをしてもらいました、そしてあなたはあなたのプロジェクトのルートにあなたの列挙型のすべてを定義するenum名前空間を常に持っているべきです。
列挙型を見つけるのに最適な場所はどこですか?
列挙型を他のタイプとは異なる方法で処理するのはなぜですか?それらが使用される可能性が高いのと同じ名前空間に保持し、他のクラスによって使用されることを想定して、それらを独自のファイルの最上位タイプにします。
私がdo一般的に一緒にまとめるタイプの唯一のタイプはデリゲートです-私は時々デリゲートの束を含むDelegates.csファイルを持っています。NET3.5とFunc/Actionではそれほどではありません。
また、名前空間は、論理的に一緒に属するものを分離するためのものです。クラスであるという理由だけで、すべてのクラスが同じ名前空間に属するわけではありません。同様に、すべての列挙型が列挙型であるという理由だけで、同じ名前空間に属するわけではありません。それらが論理的に属するコードでそれらを置きます。
列挙型と定数を、それらを消費するクラス、またはそれらを使用してコードの決定を最も制御するクラスに配置し、コード補完を使用してそれらを見つけると思います。そうすれば、それらがどこにあるかを覚えておく必要はなく、クラスに関連付けられます。したがって、たとえば、ColoredBoxクラスがある場合、それらがどこにあるかを考える必要はありません。それらはColoredBoxの一部になります。 ColoredBox.Colors.Red、ColoredBox.Colors.Blueなど。列挙型と定数は、そのクラスのプロパティまたは説明だと思います。複数のクラスで使用され、1つのクラスが最高の状態になっていない場合は、列挙型クラスまたは定数クラスを使用するのが適切です。これはカプセル化のルールに従います。異なるクラスからプロパティを分離します。 Cirleオブジェクトの赤のRGBを変更することにしたが、ColoredBoxオブジェクトの赤を変更したくない場合はどうなりますか?それらのプロパティをカプセル化すると、これが可能になります。
私は通常、サイズがどれほど小さいかに関係なく、すべての異なるタイプ(クラス、インターフェイス、列挙型)を独自のファイルに入れようとします。特に、Visual Studioを使用しておらず、「定義に移動」機能を使用している場合は、ファイルが含まれているファイルの検索と管理がはるかに簡単になります。そのような「単純な」タイプを別のクラスに入れるたびに、後で追加するか、意味をなさない方法で再利用することになります。独自のファイルがあります。
どの名前空間に関しては、開発しているものの設計に本当に依存します。一般的に、私は.NETFrameworkの規則を模倣しようとします。
クラスに関連するすべてのものをクラスに入れようとします。これには、列挙型だけでなく定数も含まれます。列挙型を含むファイルまたはクラスを他の場所で検索したくありません。クラスやフォルダーがたくさんある大きなアプリでは、列挙型ファイルをどこに置くかが常に明確であるとは限らないため、簡単に見つけることができます。
列挙型がいくつかの密接に関連するクラスで使用されている場合は、列挙型などの一般的な型がそこで共有されるように基本クラスを作成できます。
もちろん、列挙型が本当に一般的で広く使用されている場合は、他の一般的なユーティリティとともに、列挙型用に別のクラスを作成することをお勧めします。
これにはネストされた名前空間を使用します。 MyEnumがスコープ内の他のものと衝突しない場合でも、クラス外ではMyClass :: MyEnumの完全な使用法を使用する必要があるため、列挙型をクラス内に配置するよりも、それらの方が好きです。
ネストされた名前空間を使用することにより、「using」構文を使用できます。また、特定のサブシステムに関連する列挙型を独自のファイルに配置して、それらを使用するためにワールドを含める必要があるという依存関係の問題が発生しないようにします。
したがって、列挙型ヘッダーファイルでは次のようになります。
// MyEnumHeader.h
// Consolidated enum header file for this dll,lib,subsystem whatever.
namespace MyApp
{
namespace MyEnums
{
enum SomeEnum { EnumVal0, EnumVal1, EnumVal2 };
};
};
そして、クラスヘッダーファイルで次のようになります。
// MyInterfaceHeader.h
// Class interfaces for the subsystem with all the expected dependencies.
#include "MyEnumHeader.h"
namespace MyApp
{
class MyInterface
{
public:
virtual void DoSomethingWithEnumParam (MyEnums::SomeEnum enumParam) = 0;
};
};
または、意味のある数の列挙型ヘッダーファイルを使用します。クラスヘッダーを必要とせずに列挙型をシステムの他の場所でパラメータにできるように、それらをクラスヘッダーから分離しておくのが好きです。次に、それらを他の場所で使用する場合は、列挙型がクラス内で宣言されている場合のように、カプセル化クラスdefを用意する必要はありません。
そして、前述のように、外部コードでは次を使用できます。
using namespace MyApp::MyEnums;
列挙型が、使用する予定のクラスの外部で使用される可能性がある場合は、列挙型用に別のソースファイルを作成します。それ以外の場合は、使用する予定のクラス内に配置します。
通常、列挙型は、MyClassOptionsタイプのものとして単一のクラスを中心としていることがわかります。
その場合、列挙型をMyClassと同じファイルに配置しますが、名前空間内でクラスの外に配置します。
namespace mynamespace
{
public partial class MyClass
{
}
enum MyClassOptions
{
}
}
私はそれらを定義する傾向があり、それらの使用は明白に明白です。何らかの理由でそれを利用する構造体のtypedefがある場合...
typedef enum {
HI,
GOODBYE
} msg_type;
typdef struct {
msg_type type;
union {
int hivar;
float goodbyevar;
}
} msg;