2015-04-03 86 views
0

Hiii。所以,我有這些很長的switch-case,我有這些代碼:可能的重構?長時間重複的代碼行java

case 34: 
      if(cToken.getName() == TokenName.PROG_NAME.toString() 
       || cToken.getName() == "DEDENT" 
       || cToken.getName() == TokenName.ASSIGN.toString() 
       || cToken.getName() == TokenName.PROC_CALL.toString() 
       || cToken.getName() == TokenName.BREAK.toString() 
       || cToken.getName() == TokenName.CONTINUE.toString() 
       || cToken.getName() == TokenName.DATATYPE_BOOL.toString() 
       || cToken.getName() == TokenName.DATATYPE_CHAR.toString() 
       || cToken.getName() == TokenName.DATATYPE_FLOAT.toString() 
       || cToken.getName() == TokenName.DATATYPE_INT.toString() 
       || cToken.getName() == TokenName.DATATYPE_STRING.toString() 
       || cToken.getName() == TokenName.DATATYPE_VOID.toString() 
       || cToken.getName() == TokenName.INPUT.toString() 
       || cToken.getName() == TokenName.OUTPUT.toString() 
       || cToken.getName() == TokenName.IF.toString() 
       || cToken.getName() == TokenName.DO.toString() 
       || cToken.getName() == TokenName.WHILE.toString() 
       || cToken.getName() == TokenName.INC_OP.toString() 
       || cToken.getName() == TokenName.DEC_OP.toString()){ 
        reduce(51); 
      } else { 
       error(); 
      } break; 
case 35: 
      if(cToken.getName() == TokenName.PROG_NAME.toString() 
       || cToken.getName() == "DEDENT" 
       || cToken.getName() == TokenName.ASSIGN.toString() 
       || cToken.getName() == TokenName.PROC_CALL.toString() 
       || cToken.getName() == TokenName.BREAK.toString() 
       || cToken.getName() == TokenName.CONTINUE.toString() 
       || cToken.getName() == TokenName.DATATYPE_BOOL.toString() 
       || cToken.getName() == TokenName.DATATYPE_CHAR.toString() 
       || cToken.getName() == TokenName.DATATYPE_FLOAT.toString() 
       || cToken.getName() == TokenName.DATATYPE_INT.toString() 
       || cToken.getName() == TokenName.DATATYPE_STRING.toString() 
       || cToken.getName() == TokenName.DATATYPE_VOID.toString() 
       || cToken.getName() == TokenName.INPUT.toString() 
       || cToken.getName() == TokenName.OUTPUT.toString() 
       || cToken.getName() == TokenName.IF.toString() 
       || cToken.getName() == TokenName.DO.toString() 
       || cToken.getName() == TokenName.WHILE.toString() 
       || cToken.getName() == TokenName.INC_OP.toString() 
       || cToken.getName() == TokenName.DEC_OP.toString()){ 
        reduce(52); 
      } else { 
       error(); 
      } break; 

好吧,這只是兩個我的情況。我只是想知道是否有一種方法可以讓我/可以使用這個長表達式的快捷方式(重複),但是因爲我在不同的情況下使用它們,不同的是 - 要做 - (如果它通過'if'測試例如(案例34,調用減少方法以51作爲輸入和情況35,調用減少方法與52作爲輸入)

基本上,我阿斯金是,如果有一種方法,我可以喜歡把

cToken.getName() == TokenName.PROG_NAME.toString() 
|| cToken.getName() == "DEDENT" 
|| cToken.getName() == TokenName.ASSIGN.toString() 
|| cToken.getName() == TokenName.PROC_CALL.toString() 
|| cToken.getName() == TokenName.BREAK.toString() 
|| cToken.getName() == TokenName.CONTINUE.toString() 
|| cToken.getName() == TokenName.DATATYPE_BOOL.toString() 
|| cToken.getName() == TokenName.DATATYPE_CHAR.toString() 
|| cToken.getName() == TokenName.DATATYPE_FLOAT.toString() 
|| cToken.getName() == TokenName.DATATYPE_INT.toString() 
|| cToken.getName() == TokenName.DATATYPE_STRING.toString() 
|| cToken.getName() == TokenName.DATATYPE_VOID.toString() 
|| cToken.getName() == TokenName.INPUT.toString() 
|| cToken.getName() == TokenName.OUTPUT.toString() 
|| cToken.getName() == TokenName.IF.toString() 
|| cToken.getName() == TokenName.DO.toString() 
|| cToken.getName() == TokenName.WHILE.toString() 
|| cToken.getName() == TokenName.INC_OP.toString() 
|| cToken.getName() == TokenName.DEC_OP.toString() 

到一個變量或一些佔位符,然後在if子句中使用該變量,以便長代碼塊只出現一次,然後我只是要使用包含該變量的變量?

對不起,如果我不能更好地解釋..謝謝!

+2

不要使用'=='或'!='比較字符串。改爲使用「equals(...)」或「equalsIgnoreCase(...)」方法。理解'=='檢查兩個*對象引用*是否相同,而不是你感興趣的。另一方面,方法檢查兩個字符串是否具有相同順序的相同字符,這就是這裏很重要。 – 2015-04-03 19:36:45

+0

哦,對。謝謝你的提示!我會立即修復它們:) – kimsanity 2015-04-03 19:38:34

+0

似乎你應該在'if'條件下有'switch-case',而不是相反。另外,在'switch'中有35個case不是個好主意。嘗試設計一種方法,用幾行代碼將它們集中在一起(這幾乎總是可行的)。 – 2015-04-03 19:42:03

回答

2

考慮將您的字符串放入ArrayList或HashSet等集合中,然後通過contains(String)方法查看集合中是否包含感興趣的字符串。

作爲一個側面推薦,不要使用==!=來比較字符串。改爲使用equals(...)equalsIgnoreCase(...)方法。瞭解==檢查兩個對象引用是否相同,這不是您感興趣的內容。另一方面,方法檢查兩個字符串是否具有相同順序的相同字符,這是重要的。

1

看起來傳遞給reduce的值比case標籤多17。

您可以確保您打開的值在您需要的範圍內,然後通過value + 17reduce

if (value >= x && value <= y) 
{ 
    if (/* really long conditions here */) 
    { 
     reduce(value + 17); 
    } 
} 

如果不是這樣的標籤並傳遞給reduce值(和「加17」只是爲2情況下,你表現出一種巧合),然後創建情況的Map<Integer, Integer>之間的數學關係打電話給reduce時減少要使用的值的標籤。

這將消除需要複製長的if條件一遍又一遍地爲每個案件。

其次,將getName()的所有可能值都放在List<String>中,並調用contains以查看它是否與其中的一個匹配。

 if (listOfValues.contains(cToken.getName()) { 
+0

嗨!你能否詳細說明Map 的想法?謝謝! – kimsanity 2015-04-03 19:50:12

+0

您可以預先將整數對放入'Map'中,例如放(34,51);放(35,52);放(1,99);'。然後,如果您的條件滿足,只需調用'reduce(myMap.get(value));'。 – rgettman 2015-04-03 19:54:18

+0

謝謝!我會稍後再嘗試! – kimsanity 2015-04-03 20:09:13

0

您可以創建一個可以接受的令牌

List<String> tokens = Arrays.asList(TokenName.PROG_NAME.toString(), "DECENT", ...); 

列表,然後用

tokens.contains(cToken.getName()) 
0

檢查你能的方法getReductionFactor()添加到您的TokenName類?然後只需撥打

reduce(value + cToken.getReductionFactor()); 

並且完成它。

+0

該方法包含哪些內容?抱歉。 – kimsanity 2015-04-03 20:08:15

+0

您可以向TokenName類添加一個私有的最終reductionFactor字段,在構造函數中初始化它,並將其返回到getter中。 – 2015-04-03 20:42:03