可能的重构?长重复代码行 java
possible refactor? long repeating lines of codes 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;
好的,这只是我遇到的两个案例。我只是想知道是否有一种方法可以 make/use 那个长表达式(重复)的快捷方式但是因为我在不同的情况下使用它们,有不同的 -to-do- (如果它通过 'if' 测试例如(案例 34,以 51 作为输入调用 reduce 方法,案例 35,以 52 作为输入调用 reduce 方法)
基本上,我想问的是是否有一种方法可以放置
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 子句中使用该变量,这样长代码块只出现一次,然后我就使用包含它的变量?
抱歉,如果我不能解释得更好..谢谢!
考虑将您的字符串放入 ArrayList 或 HashSet 等集合中,然后通过 contains(String)
方法查看集合中是否包含感兴趣的字符串。
附带建议,不要使用 ==
或 !=
比较字符串。请改用 equals(...)
或 equalsIgnoreCase(...)
方法。了解 ==
检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否相同字符顺序相同,这就是这里的重点。
似乎传递给 reduce
的值比 case
标签多 17。
你可以确保你开启的值在你需要的范围内,然后将value + 17
传递给reduce
。
if (value >= x && value <= y)
{
if (/* really long conditions here */)
{
reduce(value + 17);
}
}
如果案例标签和传递给 reduce
的值之间没有数学关系(并且 "plus 17" 只是您展示的 2 个案例的巧合),则创建一个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 class 添加一个方法 getReductionFactor()
吗?然后打电话
reduce(value + cToken.getReductionFactor());
并完成它。
嗨。所以我有这些很长的开关盒,我有这些代码:
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;
好的,这只是我遇到的两个案例。我只是想知道是否有一种方法可以 make/use 那个长表达式(重复)的快捷方式但是因为我在不同的情况下使用它们,有不同的 -to-do- (如果它通过 'if' 测试例如(案例 34,以 51 作为输入调用 reduce 方法,案例 35,以 52 作为输入调用 reduce 方法)
基本上,我想问的是是否有一种方法可以放置
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 子句中使用该变量,这样长代码块只出现一次,然后我就使用包含它的变量?
抱歉,如果我不能解释得更好..谢谢!
考虑将您的字符串放入 ArrayList 或 HashSet 等集合中,然后通过 contains(String)
方法查看集合中是否包含感兴趣的字符串。
附带建议,不要使用 ==
或 !=
比较字符串。请改用 equals(...)
或 equalsIgnoreCase(...)
方法。了解 ==
检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否相同字符顺序相同,这就是这里的重点。
似乎传递给 reduce
的值比 case
标签多 17。
你可以确保你开启的值在你需要的范围内,然后将value + 17
传递给reduce
。
if (value >= x && value <= y)
{
if (/* really long conditions here */)
{
reduce(value + 17);
}
}
如果案例标签和传递给 reduce
的值之间没有数学关系(并且 "plus 17" 只是您展示的 2 个案例的巧合),则创建一个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 class 添加一个方法 getReductionFactor()
吗?然后打电话
reduce(value + cToken.getReductionFactor());
并完成它。