论坛首页 Java企业应用论坛

实践中的重构01_一段代码的细调

浏览 5737 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-08-03   最后修改:2010-08-03
抛出异常的爱 写道
zhang_xzhi_xjtu 写道


其实我个人最喜欢的风格是简单的方法的guard condition不用大括号{},这样代码变为

private static String getAbbreviatedEmail(String email, int prefix, int suffix) {

        if (StringUtil.isBlank(email)) //1
            return email;

        if (email.length() <= DEFAULT_TOTAL) //2
            return email;

        // @所在位置
        int splitPos = StringUtil.lastIndexOf(email, '@');
        if (splitPos == -1 || splitPos == 0) //3
            return email;

        // @前的字符段
        String preEmail = StringUtil.substring(email, 0, splitPos);
        if (preEmail.length() > DEFAULT_PREFIX_LENGTH) {//4
            preEmail = StringUtil.abbreviate(preEmail, prefix);
        }

        // @后的字符段,包含@
        String lastEmail = StringUtil.substring(email, splitPos, email.length());
        if (lastEmail.length() > DEFAULT_SUFFIX_LENGTH) {//5
            lastEmail = StringUtil.abbreviate(latEmail, suffix);
        }

        return preEmail.concat(latEmail);
    }


正则式可以干掉1 ,3 ,多个@ , @在开头 状况
//一般的程序员对正则并不熟悉,用正则的话程序的清晰性下降。
//还有一个原因是我不知道有没有精确的email格式定义。

2 与 4,5 逻辑重叠
如果不是重构.
可以问一下美工到底是要什么效果
去掉其中的一些逻辑.
//逻辑没有重复啊,2是判断总长度的,4,5是判断前缀和后缀的,对于总长度不超的,即使其前缀或后缀超出也是不处理的。


preEmail变换....与lastEmail变换最好不要把自己变更
//一般是不建议给变量重新赋值,但是这个一般是对传入参数而言,方法体内的变量意义保持清晰的时候我认为重新赋值是没有问题的。而且String是不变类型,也没有什么诡异的副作用。

还有就是返回值 return preEmail+latEmail;
就可以了看的明白更重要一些.
//同意

看一下能否用上.
StringBuilder buffer = StringBuilder();
String[] emailarry = StringUtil.split(email,"@");
int[] keys = {DEFAULT_PREFIX_LENGTH,DEFAULT_SUFFIX_LENGTH};
for(int i = 0 ; i < emailarry.length ; i++){
   ...............
}

//这个怎么用,请明示。谢谢。



0 请登录后投票
   发表时间:2010-08-03  
iaimstar 写道
没感觉重构完之后有什么不同

好冷
0 请登录后投票
   发表时间:2010-08-04  
我理解的好的代码应该只有一个出口,所以稍微改了一下楼主的代码,欢迎大家拍砖
private static String getAbbreviatedEmail(String email, int prefix, int suffix) { 

  String reemail;
  if (StringUtil.isBlank(email)||email.length() <= DEFAULT_TOTAL) { 
           reemail=email;
   } 
  else
{
        // @所在位置 
       int splitPos = StringUtil.lastIndexOf(email, '@'); 
       if (splitPos == -1 || splitPos == 0) { 
            reemail=email;
       } 
else{

// @前的字符段 
   String preEmail = StringUtil.substring(email, 0, splitPos); 
if (preEmail.length() > DEFAULT_PREFIX_LENGTH) { 
preEmail=StringUtil.abbreviate(preEmail, prefix)

   // @后的字符段,包含@ 
   String lastEmail = StringUtil.substring(email, splitPos, email.length()); 
   if (lastEmail.length() > DEFAULT_SUFFIX_LENGTH) { 
lastEmail=StringUtil.abbreviate(latEmail, suffix); 

  
   reemail=preEmail.contact(lastEmail);
   }
}
return reemail;
0 请登录后投票
   发表时间:2010-08-04  
正则还是比较好理解的,而且楼主不过是验了一下@和前后缀长度而已,一般不可能弄出很复杂的正则表达式

重构后感觉条理清晰多了,不过我觉得大部分人写出来的应该都是这一版,而很少出现第一种情况啊
0 请登录后投票
   发表时间:2010-08-04  
一直不明白,魔数有那么差么?
0 请登录后投票
   发表时间:2010-08-04  
flyingpig4 写道
我理解的好的代码应该只有一个出口,所以稍微改了一下楼主的代码,欢迎大家拍砖
private static String getAbbreviatedEmail(String email, int prefix, int suffix) { 

  String reemail;
  if (StringUtil.isBlank(email)||email.length() <= DEFAULT_TOTAL) { 
           reemail=email;
   } 
  else
{
        // @所在位置 
       int splitPos = StringUtil.lastIndexOf(email, '@'); 
       if (splitPos == -1 || splitPos == 0) { 
            reemail=email;
       } 
else{

// @前的字符段 
   String preEmail = StringUtil.substring(email, 0, splitPos); 
if (preEmail.length() > DEFAULT_PREFIX_LENGTH) { 
preEmail=StringUtil.abbreviate(preEmail, prefix)

   // @后的字符段,包含@ 
   String lastEmail = StringUtil.substring(email, splitPos, email.length()); 
   if (lastEmail.length() > DEFAULT_SUFFIX_LENGTH) { 
lastEmail=StringUtil.abbreviate(latEmail, suffix); 

  
   reemail=preEmail.contact(lastEmail);
   }
}
return reemail;

不好,如果用人脑执行这段代码,需要多费不少精力。
0 请登录后投票
   发表时间:2010-08-04  
适合初学者,我喜欢.
0 请登录后投票
   发表时间:2010-08-04   最后修改:2010-08-04
对于2,4,5
还有传入的后两个值
三个default值

你可以描述一下
他们所表示的目的
不是实现方式

你就发现设计这几个数值的人是程序员而不是需求.

public static String abbreviate(String str, int maxWidth)
max 到底是default 还是传入的数值.
非常的混乱.
名子也很混乱.
读代码只能明白期待值
而不能明白目的就不太可能成为好代码 .
0 请登录后投票
   发表时间:2010-08-04  
flyingpig4 写道
我理解的好的代码应该只有一个出口,所以稍微改了一下楼主的代码,欢迎大家拍砖
private static String getAbbreviatedEmail(String email, int prefix, int suffix) { 

  String reemail;
  if (StringUtil.isBlank(email)||email.length() <= DEFAULT_TOTAL) { 
           reemail=email;
   } 
  else
{
        // @所在位置 
       int splitPos = StringUtil.lastIndexOf(email, '@'); 
       if (splitPos == -1 || splitPos == 0) { 
            reemail=email;
       } 
else{

// @前的字符段 
   String preEmail = StringUtil.substring(email, 0, splitPos); 
if (preEmail.length() > DEFAULT_PREFIX_LENGTH) { 
preEmail=StringUtil.abbreviate(preEmail, prefix)

   // @后的字符段,包含@ 
   String lastEmail = StringUtil.substring(email, splitPos, email.length()); 
   if (lastEmail.length() > DEFAULT_SUFFIX_LENGTH) { 
lastEmail=StringUtil.abbreviate(latEmail, suffix); 

  
   reemail=preEmail.contact(lastEmail);
   }
}
return reemail;

这个处理根本就不是重构了,反而使简单的事情变的复杂了,太多的if条件判断,而且把这段代码给别人看,别人也会很晕
0 请登录后投票
   发表时间:2010-08-04  
flyingpig4 写道
我理解的好的代码应该只有一个出口,所以稍微改了一下楼主的代码,欢迎大家拍砖
private static String getAbbreviatedEmail(String email, int prefix, int suffix) { 

  String reemail;
  if (StringUtil.isBlank(email)||email.length() <= DEFAULT_TOTAL) { 
           reemail=email;
   } 
  else
{
        // @所在位置 
       int splitPos = StringUtil.lastIndexOf(email, '@'); 
       if (splitPos == -1 || splitPos == 0) { 
            reemail=email;
       } 
else{

// @前的字符段 
   String preEmail = StringUtil.substring(email, 0, splitPos); 
if (preEmail.length() > DEFAULT_PREFIX_LENGTH) { 
preEmail=StringUtil.abbreviate(preEmail, prefix)

   // @后的字符段,包含@ 
   String lastEmail = StringUtil.substring(email, splitPos, email.length()); 
   if (lastEmail.length() > DEFAULT_SUFFIX_LENGTH) { 
lastEmail=StringUtil.abbreviate(latEmail, suffix); 

  
   reemail=preEmail.contact(lastEmail);
   }
}
return reemail;


单入口单出口是一个好的实践 但是并不适应所有的情况。
你改动的这个看着是有点晕晕的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics