可能的重构?代码java的长重复行

时间:2015-04-03 19:35:31

标签: java refactoring

HIII。所以我有这些非常长的开关盒,我有这些代码:

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;
好的,所以我只有两个案例。我只是想知道是否有一种方法我可以制作/使用该长表达式的快捷方式(重复),但因为我在不同的情况下使用它们,不同的 - 做 - (如果它通过&#39 ;如果'测试例如(案例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子句中使用该变量,这样长代码块只出现一次,然后我会使用包含该变量的变量?

很抱歉,如果我无法解释更好......谢谢!

4 个答案:

答案 0 :(得分:2)

考虑将您的Strings放在一个集合中,例如ArrayList或HashSet,然后通过contains(String)方法查看集合中是否包含感兴趣的String。

作为附带建议,请勿使用==!=比较字符串。请改用equals(...)equalsIgnoreCase(...)方法。理解==检查两个对象引用是否相同而不是您感兴趣的内容。另一方面,这些方法检查两个字符串是否具有相同的字符。同样的顺序,这就是重要的事情。

答案 1 :(得分:1)

传递给reduce的值似乎比case标签多17个。

您可以确保您启用的值在您需要的范围内,然后将value + 17传递给reduce

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

如果案例标签与传递给reduce的值之间没有数学关系(并且“加17”只是您展示的2个案例的巧合),那么创建一个{{1大小写标签,以减少调用Map<Integer, Integer>时要使用的值。

这样就无需为每种情况一遍又一遍地复制长reduce条件。

其次,在if中放置getName()的所有可能值,并调用List<String>以查看它是否与其中一个匹配。

contains

答案 2 :(得分:0)

您可以使用可接受的令牌创建一个列表

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

然后检查

tokens.contains(cToken.getName())

答案 3 :(得分:0)

您可以在TokenName类中添加方法getReductionFactor()吗?然后打电话

reduce(value + cToken.getReductionFactor());

并完成它。