2011-12-07 1 views
0

은 다음과 같이 사용 "구성"이라는 일부 구성 설정 조회의 인스턴스를 상상해보십시오. 여기에는 "이 기능 켜기 또는 끄기"와 "여기에 뭔가 도움이되는 특정 값"이 모두 포함됩니다. 이 두 가지 설정으로 분해 할 수 있습니다구성 설정의 의미를 과부하해야합니까? 설정의 의미에 과부하가</p> <pre><code>if(! string.IsNullOrEmpty(configuration["MySetting"]) { DoSomethingWithTheValue(configuration["MySetting"]); } </code></pre> <p>:

if(configuration["UseMySetting"]) 
{ 
    DoSomethingWithTheValue(configuration["MySetting"]); 
} 

두 번째 방법은 구성이 더 복잡하게 보이지만, 구문 분석 할 수 약간 쉽게, 그리고 행동의 두 종류를 구분합니다. 첫 번째 버전은 처음에는 훨씬 단순 해 보였지만 기본적으로 "설정 해제"로 설정 한 항목이 명확하지 않습니다. ""실제로 MySetting에 유효한 값일 수 있습니다.

일반적인 권장 사항이 있습니까? 이 약 (1) 를 분석 이야기, (2) 구성 설정을 사용하지만, 코드 샘플은 후자 때문에

+0

프로그래머가 .stackexchange.com에서 더 좋을지 확실하지 않습니다.주관적인 의도는 아닙니다. 현재 작업 환경에서 해결해야 할 것이 있습니다. –

답변

0

나는 질문이 약간 혼란을 찾을 수 있습니다. 그 혼란은 내 대답이 당신이 묻기를 의도 한 것에 부적합하다는 것을 의미합니다. 어쨌든 ...

나는 (주석 나중에 따라) 다음 의사 코드 API에 의해 설명되는 접근 방식을 제안한다

class Configuration 
{ 
    void parse(String fileName); 
    boolean exists(String name); 
    String lookupString(String name); 
    String lookupString(String name, String defaultValue); 
    int  lookupInt(String name); 
    int  lookupInt(String name, int defaultValue); 
    float lookupFloat(String name); 
    float lookupFloat(String name, float defaultValue); 
    boolean lookupBoolean(String name); 
    boolean lookupBoolean(String name, boolean defaultValue); 
    ... // more pairs of lookup<Type>() operations for other types 
} 

parse() 작업은 구성 파일을 구문 분석하고 편리한에서 구문 분석 된 데이터를 저장 형식으로, 예를 들어,지도 또는 해시 테이블. 원하는 경우 parse()은 XML, Java Properties, JSON, .ini 파일 등의 파서와 같이 타사 라이브러리에 파싱을 위임 할 수 있습니다.

구문 분석이 완료되면 응용 프로그램에서 다른 작업은 구성 설정을 검색/사용합니다.

lookup<Type>() operation은 지정된 이름의 값을 검색하고 지정된 유형으로 구문 분석합니다 (구문 분석에 실패하면 예외를 throw합니다). 각 lookup<Type>() 작업에는 두 가지 오버로드가 있습니다. 지정된 변수가 없으면 하나의 매개 변수가있는 버전에서 예외가 발생합니다. 추가 매개 변수가있는 버전 (기본값 표시)은 지정된 변수가없는 경우 해당 기본값을 리턴합니다.

exists() 작업은 지정된 이름이 구성 파일에 있는지 테스트하는 데 사용할 수 있습니다.

위의 의사 코드 API는 두 가지 이점을 제공합니다. 첫째, 구성 데이터에 대한 유형 안전 액세스를 제공합니다 (질문에 명시된 요구 사항은 아니지만 어쨌든 중요하다고 생각합니다). 둘째, "변수가 구성에 정의되지 않았습니다"와 "변수가 정의되었지만 그 값은 빈 문자열이됩니다."를 구별 할 수 있습니다.

이미 특정 구성 구문을 사용하고 있다면 위의 Configuration 클래스를 기존 구성 구문에 대한 파서 주위의 씬 래퍼로 구현하기 만하면됩니다. 아직 구성 구문을 선택하지 않았고 프로젝트가 C++ 또는 Java 인 경우 위의 의사 코드 클래스를 즉시 사용할 수있는 구현을 제공하는 내 Config4* 라이브러리를 살펴볼 수 있습니다 (여분의 종소리와 호루라기).