在程序开发中,有可能会遇到这样的一种从前台接到了一个多选框的数据进行处理,接过来的肯定是一个字符串。我之前都是用一个if-else结构直接进行下一步处理
eg:
if(context.contains(",")) { String contexts = context.split(","); for(String message:contexts) { //此处几乎就是else中的方法 } }else{ //一个方法 }
这样的开发不仅繁琐,代码冗余,还不利于维护。改的时候上下一起改,极其容易出乱子。改进的方法暂时有两种:
1.把else中的方法抽取出来,然后在else和for-each中分别调用这个方法。
2.加一个List,改进的代码为
List<String> contexts = new ArrayList<String>; if(context.contains(",")) { String contexts = context.split(","); for(String message:contexts) { contexts.add(message); } }else{ contexts.add(context); } for(String message:contexts) { //实现功能的方法 }
我个人倾向去第二种,因为第一种是把单个的小方法抽取,就意味着在if中,调用方法后,可能还需要后续的处理,比如字符串可能还需要拼接回去,多个返回的list需要整合到一起,这个整合很可能就意味着还要做去重复,无论是加标识判断是否已经重复,还是改用set,都还是很麻烦的。
在此基础上,还有一种延伸。
先看基础代码。fromGrade有两种类型,一种是直接的数字(eg:100),另一种是个范围(eg:5.5-7)
String fromGrade = gt.getFromGrade(); if(fromGrade.contains("-")) { double numS = Double.parseDouble(fromGrade.split("-")[0]); double numL = Double.parseDouble(fromGrade.split("-")[1]); if(numS <= number && number <= numL) { String toGrade = gt.getToGrade(); if(!"[GRE_YD]".equals(toTagName) && !"[GRE_SX]".equals(toTagName)) { message = "("+message+"||"+toTagName+ruleMethod+toGrade+")"; }else { message += "||("+toTagName+ruleMethod+toGrade+"&&"+toTagName+"<="; if(fromName.contains("old")) { message+=170+")"; }else { message+=800+")"; } } break; } }else{ if(num.equals(fromGrade)) { String toGrade = gt.getToGrade(); if(!"[GRE_YD]".equals(toTagName) && !"[GRE_SX]".equals(toTagName)) { message = "("+message+"||"+toTagName+ruleMethod+toGrade+")"; }else { message += "||("+toTagName+ruleMethod+toGrade+"&&"+toTagName+"<="; if(fromName.contains("old")) { message+=170+")"; }else { message+=800+")"; } }
}break;
}简单来说,这是个查询,传入值为num,如果fromGrade是一个数字,只需要判断是否相等,相等即返回,如果fromGrade是一个范围,就需要判断是否在范围内,在就返回。但是返回的message是个进行过各种处理的字符串。能看到在if-else结构中存在大量的重复代码,整个的message部分就是完全一样的,基于上面的改进思想,肯定是要把message的部分抽取出来做处理。当然可以写成if-else分别套方法,但是我不喜欢这样。我的解决方案是,加一个标识位抽取。
改进的代码如下:
String fromGrade = gt.getFromGrade(); boolean get = false; if(fromGrade.contains("-")) { double numS = Double.parseDouble(fromGrade.split("-")[0]); double numL = Double.parseDouble(fromGrade.split("-")[1]); if(numS <= number && number <= numL) { get = true; } }else{ if(num.equals(fromGrade)) { get = true; } } if(get) {
}String toGrade = gt.getToGrade(); if(!"[GRE_YD]".equals(toTagName) && !"[GRE_SX]".equals(toTagName)) { message = "("+message+"||"+toTagName+ruleMethod+toGrade+")"; }else { message += "||("+toTagName+ruleMethod+toGrade+"&&"+toTagName+"<="; if(fromName.contains("old")) { message+=170+")"; }else { message+=800+")"; } } break;
这样的改动比起抽取整个message的部分,就是节省了break;(break:因为这是个循环遍历查询结果的。)抽取方法的话,还是有这个break;的后续处理,只有这种的时候一目了然是无所谓,但是一旦很多的if,就可能导致忘记写break,尤其是其他程序员维护你的代码的时候。的确,这不是死循环,即使没有break,依旧是可以运行的,甚至差别也不会很大,但是我觉得代码的高效,是点滴积累起来的。抽取方法如果没有后续尾处理的,当然是最好最推荐的。