2011-11-17 4 views
5

나는 종종이 작업을 수행하는 올바른 방법에 대해 궁금 해서요 : 예를 들어스토어 계층 헌장 데이터

, 나는 약간의 계산에 사용되는 약 100 상수 (또는 열거)가 내 프로그램에서. 그들은 한 곳에 보관해야합니다. 그들은 예를 들어, 계층 적으로 그룹화 할 수 있습니다

System3/Rules/Rule7/ParameterXY/MaxAverageValue 

은 물론, 내가 그렇게 ressource의 어떤 종류에 저장, 코딩하면서 해당 값에 액세스하려면, 정말 옵션이 아닙니다.

지금까지 내가 말할 수있는,이를 수행 할 수 있습니다 :

  • 매우 긴 상수 이름
  • 중첩 클래스
  • 네임 스페이스 이름을 사용

은 아주 못생긴이며, 그것은이다 별로 관리하기가 쉽지 않습니다. 중첩 클래스는 좋은 방법이지만, 어떤 stylecop/fxcop 규칙은이를 금지합니다. 그래서 이것은 어떤면에서는 "나쁜"것이어야합니다. 마지막으로, 네임 스페이스를 사용하여 대안을 찾았습니다. Imho는 각각 거의 아무것도 포함하지 않는 폴더와 파일의 대량을 만듭니다. 어셈블리 반사판에 50 개의 하위 네임 스페이스가 나타날 때가 좋지 않습니다.

그래서 .. 어떻게 이런 종류의 작업을합니까? 너는 무엇을 제안 하겠는가?

+1

나는 네임 스페이스를 제안합니다. 클래스와 긴 상수 이름을 중첩하지 마십시오.읽기 어려움 –

+0

MVC는 static const public fields가있는 생성 된 클래스 클래스를 사용합니다. IIRC – sehe

+0

@StevenMuhr : 왜 중첩 클래스를 관심 읽기가 어렵다고합니까? 내 머리 꼭대기에서 나는 그들이 나를위한 해결책으로 나를 때렸다. 모든 상수를 하나의 파일에 보관할 수 있고 네임 스페이스와 동일한 계층을 얻을 수 있습니다. – Chris

답변

4

매우 긴 상수 이름

이 총의 일종이지만, 적어도를 검색합니다. 모든 코드는 동일한 위치에 있으므로 문제를 찾지 않아도됩니다.

나는 중첩 클래스에게 그것을 할 수있는 좋은 방법을 찾을 수 있지만, 일부 stylecop /의 FxCop 규칙은 금지 때문에 자동화하기 때문에 이것은이다

이유 중 하나가 나쁜 어떤 방법으로 "나쁜"해야 코드 생성/코드 검사 도구는 사용하기가 더 어렵습니다. 또 다른 이유는 Intellisense로이를 발견하는 것이 더 어렵다는 것입니다.

이 중 가장 중요한 이유는 중첩 된 클래스가 레이아웃이 논리적으로 이해할 수 있도록 객체 지향 종속성에서 강하게 연관되어야하기 때문입니다. 드문 경우를 제외하고는 (예 : Enumerator classes) 의미가 없습니다. 여러분의 경우에는 클래스가 실제로 어떤 동작이나 객체 지향도 전혀 가지지 않기 때문에 의미가 없습니다. 단지 상수의 계층 구조 일뿐입니다.

네임 스페이스 당신이 설명하는 문제에 대한

이 그것을 처리하는 가장 좋은 방법입니다. 레벨 당 혼란이 가장 적어지고 입력하는 동안 Intellisense를 얻으므로 계층 구조를 통해 내려갈 때 좁혀가는 부분을 볼 수 있습니다. 그것은 이럴

폴더와 당신이 정말로 상수의 거대한 수영장이 필요하면 각 거의 아무것도

를 포함하지 않는 파일의 질량을 생성하고, 그것은의 다른 부분을 결합하는 이해가되지 않는 하나의 파일 당 클래스와 하나의 폴더 당 이름 공간 규칙을 남용하는 드문 경우 중 하나입니다. .NET에 전역 변수를 지원하지 않기 때문에 클래스에 채우는 유일한 이유가 있습니다.

또 다른 제안

이러한 상수 대신에 속한 도메인 특정 개체가 있나요? 예 : System3/Rules/Rule7 클래스와 관련된 논리가 있습니까? 그것은 당신이 자신의 클래스로 구현해야하는 일종의 실제 비즈니스 규칙이 아닌가?

a thicker domain model이되도록 코드를 정렬 할 수 있으면 상수를 입력하는 가장 논리적 인 장소는 해당 도메인 논리를 구현하는 클래스에 있습니다.

굵은 도메인을 갖고 있지 않은 경우 완전히 일반적인 규칙 처리가 있고 비즈니스 엔진 논리를 제공하기 위해 상수를 사용하는 경우 데이터 기반 응용 프로그램이 있습니다. 즉, 코드가 아닌 구성 파일에 데이터를 저장해야합니다.

+0

마지막 제안을 보내 주셔서 감사합니다. 실제로가는 길 같습니다. 유일한 단점은 특정 상수를 찾기 위해 코드를 모르는 사람이 더 어려워진다는 것입니다. 하지만 ressource 나 config 파일 (또는 뭔가 다른 것)과 속성 (그 값을 얻는 것)은 const 대신에 우아한 해결책이 있습니다. :) – Efrain

0

글쎄, 내가하는 일은 상수라는 봉인 된 파일을 갖는 것입니다.

그렇게
public sealed class Constants 
{ 

    //for e.g. 
    //Sessions 
    public const string APPSESSIONKEY = "AppType"; 

} 

나는 내 프로젝트의 나머지 부분에서 이것을 사용보다 여기 중요성은 당신이 그것을 기억하고 당신이 그것을 필요로 할 때 의미가 도움이 될 것입니다 당신이 그것을 이름을 할 것입니다.

코드에서 호출하십시오.

Constants.AppSessionKey 

또한

는 그의 유일한 목적으로 프로젝트에 대한 상수 값을 포함하는 어셈블리를 만들 수 있습니다. 다른 모든 어셈블리는 이것을 참조해야합니다. DRY와 KISS 다음에는 참조를 추가하는 것이 간단하기 때문에. 여기서 주요 문제는 재 컴파일입니다.

1

얼마나 자주 각 상수는 여러 방법으로 재사용됩니까? 상수 재구성을 고려해 볼 수 있습니다. 방대한 수의 상수가있는 경우에도 읽기 전용 속성이있는 정적 클래스에 넣어보십시오.

모두 한 곳에서 볼 수있는 좋은 장소가 필요한 경우 app.config 파일에 저장하여 AppSettings 및 ConfigurationManager 클래스를 통해 액세스 할 수 있습니다.

0

값에 대한 읽기 전용 문자열 필드가있는 정적 클래스 계층 구조를 생성하는 사용자 지정 T4 템플릿으로 Resources 파일을 사용합니다.

리소스 파일의 키는 '.'로 구분됩니다. 계층 구조를 작성합니다.

하나의 클래스 계층 구조로 컴파일 된 별도의 리소스 파일을 가질 수 있습니다.

중첩 된 클래스는 권장되지 않지만 제 생각에는 이런 상황에서는 가장 좋은 솔루션입니다.