4

私が Java で開発するときにいつも気になる短い質問です。私は実際に多くの異なる列挙型を使用していますが、それらをどこに置くべきかわかりません。通常、列挙という名前の特別なパッケージを作成しますが、これはベスト プラクティスではないと確信しています。列挙型を、それが最も属するクラスのグループと同じパッケージに直接配置する必要がありますか?

また、別の言語 (C# または C++) でも同じでしょうか?

4

5 に答える 5

7

最適な決定は、列挙の使用方法によって異なります。

例えば

  • 列挙が 1 つのクラスでのみ使用される場合は、そのクラスの内部クラスにすることができます
  • 列挙型が 1 つのクラス (例: A) で他のクラスよりも多く使用されている場合 (例: 他のクラスAが列挙型のパラメーターを持つメソッドを呼び出している場合、同じパッケージ/名前空間に配置することをお勧めしますA

一般に、最も使用されている場所に基づいて最適なパッケージ/名前空間を見つけます

于 2012-07-19T18:35:49.177 に答える
1

アプリケーションが十分に大きくなったとき、すべての列挙型を 1 つの C# csproj/DLL ファイルに実際に移行しました。ファイルは非常に小さいものでしたが、すべてのアプリケーションから完全に切り離されていたため、次のことを意味していました。

  • 人々は常に列挙型を見つけるためにどこを見ればよいかを知っていました
  • 同じ列挙型を 2 回「再作成」する可能性を低減
  • サーバーアプリケーションとクライアントアプリケーションの両方で直接使用して、両方が同一の定義を使用していることを確認できます

これがすべての人にとって最善の解決策であるとは言いませんが、これによって私たちの煩わしさは大幅に軽減されました。

于 2012-07-19T18:35:17.763 に答える
1

列挙型の宣言と配置は、可視性とブロック階層に関する他の変数の宣言と配置と同じ規則に従います。つまり、列挙型のコードをクラス A 内に配置すると、その列挙型はクラス A に属します。

私も列挙型を広範囲に使用していますが、クリーンで正しいモデルを作成するために私がやろうとしているのは、ほとんどの場合、この場所で使用するため、列挙型を密接に属する場所に配置することです-名前空間であるかどうかに関係なく、クラスまたはネストされたクラス。他の場所から列挙型を使用している場合は、明示的にセマンティクスをモデル化する列挙型の親スコープを使用する必要があります (正しくコーディングされている場合)。

したがって、これは主に、オブジェクトに関連する現実世界のマッピング、セマンティックの一貫性、およびコードの再利用性の問題です。

于 2012-07-19T18:36:44.720 に答える
1

Java や C# についてはわかりませんが、C++ では、クラスに関連が強い場合は常に C++ クラス仕様を入れます。異なるクラスで使用する場合は、別のヘッダー ファイル (システム固有の列挙型と定数が保持される別の名前空間) に保持します。

于 2012-07-19T18:37:10.760 に答える
0

ネストされた名前空間を使用します (ここで他のスレッドを参照してください: 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;
于 2012-07-19T19:18:55.317 に答える