2010-12-01 119 views
0

我有一個類Target與「文件類型」enum它擁有我的解析器需要知道的各種文件(當前源,頭,資源)。我想我的解析功能,可以做喜歡的事,通用:可擴展的解析器設計

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

但有一個問題:我希望能夠用簡單的Target子類,即延長enum擴展已知文件類型以正確的方式,請參閱Base enum class inheritance瞭解我是如何做到的。我不想修改上面的代碼,但只是一般地擴展目標的一半。 C++ 0X可能是必需的,非常受歡迎。

謝謝!

更新:一旦試圖在這裏解釋它,併發布一些簡化的類聲明,我意識到我的設計被破壞了,並且我嘗試在我的類結構中推動fileType的特化。我只想在一個地方存儲所有已知類型的完整列表,但是在嘗試這樣做時,我不小心強迫設計一次在兩個地方訪問該列表。我現在認識到,所有文件類型的列表應該是關鍵字SOURCE,HEADER等被讀取的位置,並且從其上被一般處理。我將在一個地方存儲完整列表,然後通過「巨大」enum訪問該列表。 A std::map<fileType, std::set<std::string> >作爲合乎邏輯的選擇在我的腦海中流行,而不是分別爲每個特定的fileType命名爲set。感謝您在回覆中的braincandy!任何想法仍然受歡迎。

+1

你介意添加一些你的代碼。我不確定你想要做什麼... – ronag 2010-12-01 18:14:49

回答

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 2010-12-06 14:59:20

0

這很難回答,因爲很多事情取決於您對令牌,文件類型值和目標實例做了什麼。不過,我認爲這裏的基本主題是你需要用虛擬方法調用來替換if()語句。例如,你的代碼片段可能最終會被

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

以上tokenLists例子可以概括爲TargetSpecificLogic情況下,結合各種文件類型具體方法的註冊。

您的目標類可以實現一個虛擬方法retrieveAllKnownFileTypes(),子類可以擴展,其餘代碼可以評估哪個方法。

您的目標類別可實施虛擬方法bool isFileTypeKnown(filetype),返回truefalse

...等等。