锁定老帖子 主题:实践中的重构01_一段代码的细调
精华帖 (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++){ ............... } //这个怎么用,请明示。谢谢。 |
|
返回顶楼 | |
发表时间:2010-08-03
iaimstar 写道 没感觉重构完之后有什么不同
好冷 |
|
返回顶楼 | |
发表时间: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; } |
|
返回顶楼 | |
发表时间:2010-08-04
正则还是比较好理解的,而且楼主不过是验了一下@和前后缀长度而已,一般不可能弄出很复杂的正则表达式
重构后感觉条理清晰多了,不过我觉得大部分人写出来的应该都是这一版,而很少出现第一种情况啊 |
|
返回顶楼 | |
发表时间:2010-08-04
一直不明白,魔数有那么差么?
|
|
返回顶楼 | |
发表时间: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; } 不好,如果用人脑执行这段代码,需要多费不少精力。 |
|
返回顶楼 | |
发表时间:2010-08-04
适合初学者,我喜欢.
|
|
返回顶楼 | |
发表时间:2010-08-04
最后修改:2010-08-04
对于2,4,5
还有传入的后两个值 三个default值 你可以描述一下 他们所表示的目的 不是实现方式 你就发现设计这几个数值的人是程序员而不是需求. public static String abbreviate(String str, int maxWidth) max 到底是default 还是传入的数值. 非常的混乱. 名子也很混乱. 读代码只能明白期待值 而不能明白目的就不太可能成为好代码 . |
|
返回顶楼 | |
发表时间: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条件判断,而且把这段代码给别人看,别人也会很晕 |
|
返回顶楼 | |
发表时间: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; } 单入口单出口是一个好的实践 但是并不适应所有的情况。 你改动的这个看着是有点晕晕的。 |
|
返回顶楼 | |