小技巧(一) 标识位、List的巧妙添加

1 篇文章 0 订阅
在程序开发中,有可能会遇到这样的一种从前台接到了一个多选框的数据进行处理,接过来的肯定是一个字符串。我之前都是用一个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,依旧是可以运行的,甚至差别也不会很大,但是我觉得代码的高效,是点滴积累起来的。抽取方法如果没有后续尾处理的,当然是最好最推荐的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值