私が Java で開発するときにいつも気になる短い質問です。私は実際に多くの異なる列挙型を使用していますが、それらをどこに置くべきかわかりません。通常、列挙という名前の特別なパッケージを作成しますが、これはベスト プラクティスではないと確信しています。列挙型を、それが最も属するクラスのグループと同じパッケージに直接配置する必要がありますか?
また、別の言語 (C# または C++) でも同じでしょうか?
私が Java で開発するときにいつも気になる短い質問です。私は実際に多くの異なる列挙型を使用していますが、それらをどこに置くべきかわかりません。通常、列挙という名前の特別なパッケージを作成しますが、これはベスト プラクティスではないと確信しています。列挙型を、それが最も属するクラスのグループと同じパッケージに直接配置する必要がありますか?
また、別の言語 (C# または C++) でも同じでしょうか?
最適な決定は、列挙の使用方法によって異なります。
例えば
A
) で他のクラスよりも多く使用されている場合 (例: 他のクラスA
が列挙型のパラメーターを持つメソッドを呼び出している場合、同じパッケージ/名前空間に配置することをお勧めしますA
。一般に、最も使用されている場所に基づいて最適なパッケージ/名前空間を見つけます
アプリケーションが十分に大きくなったとき、すべての列挙型を 1 つの C# csproj/DLL ファイルに実際に移行しました。ファイルは非常に小さいものでしたが、すべてのアプリケーションから完全に切り離されていたため、次のことを意味していました。
これがすべての人にとって最善の解決策であるとは言いませんが、これによって私たちの煩わしさは大幅に軽減されました。
列挙型の宣言と配置は、可視性とブロック階層に関する他の変数の宣言と配置と同じ規則に従います。つまり、列挙型のコードをクラス A 内に配置すると、その列挙型はクラス A に属します。
私も列挙型を広範囲に使用していますが、クリーンで正しいモデルを作成するために私がやろうとしているのは、ほとんどの場合、この場所で使用するため、列挙型を密接に属する場所に配置することです-名前空間であるかどうかに関係なく、クラスまたはネストされたクラス。他の場所から列挙型を使用している場合は、明示的にセマンティクスをモデル化する列挙型の親スコープを使用する必要があります (正しくコーディングされている場合)。
したがって、これは主に、オブジェクトに関連する現実世界のマッピング、セマンティックの一貫性、およびコードの再利用性の問題です。
Java や C# についてはわかりませんが、C++ では、クラスに関連が強い場合は常に C++ クラス仕様を入れます。異なるクラスで使用する場合は、別のヘッダー ファイル (システム固有の列挙型と定数が保持される別の名前空間) に保持します。
ネストされた名前空間を使用します (ここで他のスレッドを参照してください: this に関する詳細な情報)。主なことは、問題のサブシステム外の依存関係を減らすことです。
したがって、enum ヘッダー ファイルでは次のようになります。
// 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;
};
};
次に、クライアント コードで「using」構文を使用します。
using namespace MyApp::MyEnums;