2010-12-01 6 views
0

나는 파서가 알아야 할 모든 종류의 파일 (현재 소스, 헤더, 리소스)을 보유하고있는 "fileType"이 enum 인 클래스 Target을 가지고있다. 내 구문 분석 기능과 같은 일반적인 뭔가 할 수있을 싶습니다확장 가능한 파서 디자인

if(token == some_known_fileType) 
    put_nextToken_in_the_list_for_that_fileType(); 
else 
    return an_error(); 

을 그러나 캐치가있다 : 나는 단순히 enum을 확장 Target의 서브 클래스로 알려진 파일 형식을 확장 할 수 있도록하고 싶습니다 올바른 방법으로, 내가 이것을 어떻게했는지에 관해서는 Base enum class inheritance을 참조하십시오. 위의 코드를 수정하고 싶지는 않지만 목표를 전반적으로 확장하십시오. C++ 0X가 필요할 수 있으며 대단히 환영합니다.

감사합니다.

업데이트 : 여기에서 설명하고 일부 클래스 선언을 게시하려고하면 디자인이 깨 졌음을 깨달았으며 클래스 구조에서 fileType의 전문화를 너무 심화 시키려고했습니다. 모든 알려진 유형의 전체 목록을 저장하는 곳은 한 곳만 필요했지만 그렇게하기 위해 의도적으로 디자인에 한 번에 두 곳의 목록에 액세스 할 수밖에 없었습니다. 이제는 모든 fileTypes의 목록이 SOURCE, HEADER 등의 키워드가 읽혀지고 거기에서 일반적으로 처리되어야한다는 것을 알게되었습니다. 한 곳에서 전체 목록을 저장하고 나중에 "거대한"enum을 통해 해당 목록에 액세스합니다. 각 fileType에 대해 set이라는 별도의 이름 대신 std::map<fileType, std::set<std::string> >이 논리적으로 선택되었습니다. 귀하의 답변에 braincandy 주셔서 감사합니다! 모든 생각은 여전히 ​​환영받습니다.

+1

코드를 추가 하시겠습니까?나는 당신이 무엇을하고 싶은지 확신 할 수 없다. ... – ronag

답변

2

저는 이것이 일반적으로 올바른 접근법이 아니라고 생각하지만, 그것은 제 믿음입니다. 나는 다른 방식으로 이것을 할 것이다. 한 걸음 뒤로 물러나서 우리가 달성하고자하는 것은 들어오는 (입력 매개 변수) 값을 기반으로 동작을 제어하려고합니다. 클래스가 있다고 가정 해 봅시다 : FileA FileB ... file_type은 파일 유형을 보유합니다. 팩토리를 사용하여 사용 가능한 파일 목록 (다른 파일의 등록을 기반으로 변경할 수 있음)을 제어합니다.

class FileA { 
    void register_type(); // register itself to the factory. 
}; 

class FileB.. 
//main code 
class FileFactoryDelegator { 
    ... 
    delegateControl (FileType file_type) { 
     //validate file_type. 
     file_types[file_type]->performFileOperation (..); 
    } 
}; 

if-else 루프 대신.

file_factory.delegateControl (token); 
+0

이것은 실제로 실제로는'std :: map >'을 통해 구현 한 것인데 훨씬 유연하다. 전에 생각했던 것보다. 감사! (필자는 fileType 등록을 할 필요가 없었고, 항상 그것들 모두를 사용할 수있었습니다. 또한'std :: map :: operator []'는 요소가 아직 존재하지 않는다면 그것을 만듭니다, 이것은 단지 보너스입니다!) – rubenvb

0

토큰, 파일 유형 값 및 대상 인스턴스를 사용하여 정확하게 수행하는 작업에 따라 대답하기가 어렵습니다. 그러나 여기에서 기본 테마는 if() 문을 가상 메서드 호출로 대체해야한다는 것입니다. 예를 들어, 코드는

if (tokenLists.supportsFileType(token)) 
    tokenLists.getListForType(token).put_nextToken_into_this_list(); 
else 
    return an_error(); 

위 tokenLists 예

이 파일 형식 특정 방법의 모든 종류의 결합 TargetSpecificLogic 인스턴스의 레지스트리에 일반화 될 수있는 끝낼 수 있었다.

대상 클래스는 하위 클래스가 확장하고 나머지 코드를 평가할 수있는 가상 메서드 retrieveAllKnownFileTypes()을 구현할 수 있습니다.

대상 클래스가 bool isFileTypeKnown(filetype) 인 가상 메서드를 구현하여 true 또는 false을 반환 할 수 있습니다.

... 등등.