這個問題不具體地約約適當類型的對象(或對象的適當構造函數)如何可以使用正則表達式進行標記化,但更匹配來處理標記器輸出的標記。OO策略的一組令牌匹配到適當的方法/構造
爲了解釋多一點,我的目標是解析包含令牌線成描述數據適當的對象的文本文件。我的解析器實際上已經完成,但目前是一個混亂的switch
... case
聲明和我的問題的重點是我如何使用一個很好的面向對象方法重構這個。
首先,這裏有一個例子來說明我在做什麼。試想一下,包含很多項,如以下兩個文本文件:
cat 50 100 "abc"
dog 40 "foo" "bar" 90
在解析文件的這兩個特定行,我需要分別創建類Cat
和Dog
實例。實際上,有相當多的不同對象類型被描述,並且有時會有不同數量的參數變體,如果這些值不是用來明確說明它們的話,通常會假定缺省值(這意味着通常使用構建器創建對象時的模式,或者某些類有幾個構造函數)。
每條線的初始標記都是使用一個Tokenizer
類創建的,該類使用正則表達式組與每種類型的可能標記(整數,字符串和一些與此應用程序相關的其他特殊標記類型)相匹配的正則表達式組與Pattern
和Matcher
。從此標記生成類最終的結果是,對於每個它解析線,它提供回Token
對象,其中每個Token
具有原始值屬性沿.type
屬性(指定整數,字符串等)的列表。
對於解析的每一行,我必須:
-
對象類型
switch
case
...(第一令牌);switch
對參數的數量和選擇該數量的參數的適當構造 ;- 檢查每個標記類型是否適合構建該對象所需的參數類型;
- 如果參數類型的數量或組合不適合要調用的對象類型,則記錄錯誤。
解析器我此刻有很多switch
/case
或if
/else
各地來處理這個地方,雖然它的工作原理,有相當大數量的對象類型,它變得有點笨拙。
有人建議可以替代,清潔和模式標記列表匹配到合適的方法調用更多的「OO」的方式?
類是一種類型,而不是一個值。你需要Integer.class –
是的,@Ricky,對不起 - 當然你是對的。 – amn
非常感謝@amn;非常感謝你投入這個時間。它給了我一些啓發,儘管目前我還沒有完全理解這是否可以解決大量混亂的if/switch語句以確保接收到的令牌與每個對象構造函數的參數要求匹配的問題。例如:對於一個特定對象,我需要檢查是否有5個標記,其中4個是整數,最後是一個字符串;否則,記錄一個錯誤。如果我發佈一些示例代碼,這可能是最好的。與此同時,這裏有很好的靈感,特別是使用反射和地圖。 – Trevor