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



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;

好的,这只是我的两个案例。我只是想知道是否有一种方法可以为长表达式(重复)创建/使用快捷方式,但因为我在不同的情况下使用它们,有不同的待办事项(如果它通过了"if"测试,例如(情况34,调用reduce方法,输入51,情况35,调用reduct方法,输出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子句中使用该变量,这样长代码块只出现一次,然后我只使用包含它的变量?

对不起,如果我不能更好地解释。。非常感谢。

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

作为附带建议,不要使用==!=来比较Strings。请改用equals(...)equalsIgnoreCase(...)方法。理解==检查两个对象引用是否相同,这不是你感兴趣的。另一方面,方法检查两个String是否具有相同顺序的相同字符,这就是这里重要的。

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

您可以确保打开的值在所需的范围内,然后将value + 17传递给reduce

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

如果事例标签和传递给reduce的值之间没有数学关系("加17"只是您显示的两个事例的巧合),那么创建一个事例标签的Map<Integer, Integer>,以减少调用reduce时使用的值。

这将消除对每种情况反复复制长if条件的需要。

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

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

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

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

然后用检查

tokens.contains(cToken.getName())

你能给你的TokenName类添加一个方法getReductionFactor()吗?然后打电话给

reduce(value + cToken.getReductionFactor());

并用它完成。

最新更新