2012-07-19 5 views
2

Java로 개발할 때 항상 저를 괴롭히는 짧은 질문입니다. 나는 실제로 다른 열거 형을 많이 사용하며 어디에 넣어야하는지 절대 확신하지 못합니다. 일반적으로 라는 열거 형이라는 특수 패키지를 만듭니다.이 패키지는 모범 사례가 아닙니다. 내 열거 형을 가장 속한 클래스 그룹과 같은 패키지에 직접 넣어야합니까?어디에서 우리 열거 형을 써야합니까?

또한 다른 언어 (C# 또는 C++)에서 동일합니까?

+1

.NET 및 C++에는 패키지가 없으므로이 패키지와 완전히 관련이 없습니다. – Oded

+2

@Oded 해당 이름 공간이됩니다. –

+0

.NET에서 사용되는 네임 스페이스에 넣으십시오. –

답변

5

가장 좋은 설명은 열거 형의 사용 방법에 따라 다릅니다.

예. 열거가 하나 개의 클래스에 의해 사용되는 경우 열거는 하나 개의 클래스에서 사용하는 경우

  • , 당신은 그 클래스
  • 에 그것을 내부 클래스를 만들 수 있습니다 (예 : A)을 (예를 들어 다른 사람이 메소드를 호출 다른 사람보다 더 A에 열거 형의 파라미터를 가질 수, A은에서와 같이 동일한 패키지/네임 스페이스에 넣어 할 수 있습니다
  • 일반적으로

이 가장

사용 위치에 따라 최적의 패키지/네임 스페이스를 찾을 수 있습니다.
1

내 응용 프로그램이 충분히 커지면서 모든 enum을 단일 C# csproj/DLL 파일로 마이그레이션했습니다. 이 파일은 매우 작은 이었지만, 완전히 모든 응용 프로그램에서 분리 되었기 때문에, 그것은 의미 :

  • 사람들은 항상 열거
  • 두 번 "다시"같은 열거의 감소 가능성
  • 을 찾아 볼 위치를 알고
  • 모두 내가이 모든 사람을위한 최고의 솔루션입니다 주장하지 않습니다 동일한 정의

를 사용하고 있는지 확인하기 위해 직접 서버 응용 프로그램 및 클라이언트 응용 프로그램 모두에서 사용하지만, 정말 우리의 번거 로움 수준을 감소시킬 수있다.

1

열거 형의 선언 및 배치는 가시성 및 블록 계층 구조와 관련된 다른 변수의 선언 및 배치와 동일한 규칙을 따릅니다. 즉, 열거 형의 코드를 클래스 A에 넣으면 열거 형은 클래스 A에 속하게됩니다.

저는 enum을 광범위하게 사용하고 있으며 깨끗하고 올바른 모델을 만들기 위해 노력하고 있습니다. 그것이 네임 스페이스, clas 또는 중첩 클래스에 관계없이 대부분이 시간에 내가 이것을이 장소에서 사용할 것이기 때문에 그것이 밀접하게 속해있는 열거 형을 넣으십시오. 내가 어디에서나 열거 형을 사용할 때 열거 형의 부모 범위를 명시 적으로 사용해야 할 것이다.

그래서 이것은 주로 오브젝트 관련 실제 매핑, 의미 일관성 및 코드 재사용 가능성에 대한 질문입니다.

1

Java 나 C#에 대해서는 잘 모르겠지만 C++에서는 클래스와 밀접한 관련이있는 경우 C++ 클래스 스펙을 사용합니다. 그것은 다른 클래스간에 사용되는 경우, 별도의 헤더 파일 (별도의 네임 스페이스에서 시스템 특성 열거 형 및 상수가 유지되는 곳에)에 보관합니다.

0

중첩 된 네임 스페이스를 사용하십시오 (다른 스레드는 여기 Fuller information on this 참조). 가장 중요한 것은 문제의 하위 시스템 외부의 종속성을 줄이는 것입니다.

그래서 열거 헤더 파일에 당신이 얻을 :

// 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 namespace MyApp::MyEnums;