说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

重构:仔细查看,改进代码

HTML文档下载 WORD文档下载 PDF文档下载
重构是一门改变已经正常的工作的艺术。但是重构是需要理由的。可能是设计改进,性能问题,安全角色或者很多其他的原因。

我建议你进行一个练习:当你第二天早晨开始工作的时候,重新审视你的项目源码,尝试发现进行重构的机会。就算你的领导没有要求,仍然去做。因为在工作中,你希望有一些激动人心的时候。

重构是一门改变已经正常的工作的艺术。但是重构是需要理由的。可能是设计改进,性能问题,安全角色或者很多其他的原因。改进程序的技术缺点是要冒风险的,尽管能够使其更稳定,并且可能能够提高你自己今后的生产力。

这不是为了公司或者领导好,而是为了自己。为什么?因为问题都是逐渐累积的,到达一个程度之后,你会失去对代码的控制。你将会面对苦于交付结果的境地,最终可能毁掉你的职业生涯。

好吧,让我们从一个更加积极的角度来看这个问题。在重构过程中你会学习到很多,并且很快意识到你产出了比之前更好的代码。重构越多,你就越聪明,慢慢累积直到你达到创新的级别。但是这意味着什么,你又如何知道你达到了呢?

当你发现一个明显的机会来对你当前的工作进行改进,并且你意识到至今为止还没有别人做过这样的事情(至少你找不到)。这不容易,这不容易,但这常发生在你不断重复做一件事情,并且你能够发现你如何能够使得同样的事情做得又快又好。让我用一个真实的故事来说明。

例子是在Java中进行字符串连接:一个经典问题,曾经在过去数年困扰了大量专家,但在今天可能已经被忽略了。在JDK1.5之前,尽管可读性高而且简单,但使用“+”来进行字符串连接可能产生效率极低的代码。之后,“+”操作符被换成了StringBuffer,从而真正改进了连接。使用“+”越多,则在内存中的String和StringBuffer实例越多,为了管理所有的对象花费的时间也越多。因此,开发者们被推动使用StringBuffer而忽略“+”。看下面的例子:

String title = "Mr."; String name = "John"; String familyName = "Smith";  String message = "Dear " + title + " " +                  name + " " + familyName + ",";
开发者习惯于这样写代码,但是现在被推动这么做:

StringBuffer sb = new StringBuffer(); sb.append("Dear "); sb.append(title); sb.append(" "); sb.append(name); sb.append(" "); sb.append(familyName); sb.append(",");
你可能同意第一个例子可读性高于第二个。开发者使用“+”进行字符串连接时很自然的,所以丢弃这样的形式不合适。好消息是,编译人员做了一些事情来维护这样的习惯,确保了JDK1.5会优化连接方法。代替线程安全的StringBuffer,他们建立了一个叫做StringBuilder(非线程安全,但更快)的类,并且他们确保能够像第一个例子中那样,使用一个实例就能处理所有的连接。这是一个很重要的进步,因为他们兼顾了简洁而不单纯是技术性。第一个例子在编译时会自动转换成如下情况:

StringBuilder sb = new StringBuilder(); sb.append("Dear ").append(title).append(" ")   .append(name).append(" ").append(familyName)   .append(",");
但是,在一些复杂逻辑代码中的字符串连接还是需要使用StringBuilder,因为编译器还没有那么智能,例如:

List<Student> students = studentBean.findStudents(); String intro = "The following students were approved:\n"; String listedNames = "";String separator = "";for(Student student: students) {  if(student.approved()) {    if(!listedNames.isEmpty()) {      separator = ", ";    }    listedNames += separator + student.getName();  } }String msg = intro + listedNames;messengerBean.sendMessage(msg);
如下写法会更有效率:

List<Student> students = studentBean.findStudents();String intro = "The following students were approved:\n";StringBuilder listedNames = new StringBuilder();String separator = "";for(Student student: students) {  if(student.approved()) {    if(!listedNames.length() > 0) {      separator = ", ";    }    listedNames.append(separator)               .append(student.getName());  }} String msg = intro + listedNames.toString();messengerBean.sendMessage(msg);

呃!你注意到有什么奇怪的东西了么?可能一眼看起来不是很明显,但是看看他们是如何在定义分隔符之前检查listedNames是否为空的。String类在JDK1.6中有一个可读性很好的方法isEmpty(),但是StringBuilder仍然使用相对比较老的方式。为什么他们不将StringBuilder 和 StringBuffer改为同样的方式呢?

在核心库开发的邮件列表中讨论了这个问题,没有发现什么明显原因导致他们之前没有这么做。可能只是忘记了。要感谢大规模的重构,试图改进效率低下的字符串连接方法,才能发现这样的不一致。我相信在明年推出的Java8中会有时间修复这个问题。只要在接口CharSequence加入isEmpty()方法,这样就能使得所有实现都变得同样优雅。

这可能是一件简单的事情,但是Java是一个严格审查下的复杂的语言,所以每个细节都会带来很大的影响。所以,做一些重构,发现一些改进代码的机会,同样也能够改进你使用的编程语言。让我们一起推动Java进步吧!

英文原文:Java Code Geeks

译文来自:ImportNew
白帽黑客英年早逝:R.I.P,Barnaby Jack 苹果发布支持iTunes Radio服务的iTunes 11.1测试版 诺基亚将发布Treasure Tag配件 让你再也不怕丢东西 从三大互联网巨头布局,看移动时代的商业逻辑 亚马逊应用商店:一个开发者走向世界的机会? 企业级App探索:开发者们的正途在哪里? 如何有效地在海外市场推广产品? 网站转化率统计分析及优化方案 从资深设计师那我们能学到什么? 原作者使用Go开发memcached替代版,现已扎寨谷歌多个项目 像证券一样交易云资源,Zimory一年内收入翻两番并获德国证交所青睐 移动SDK崛起:未来会不会整合成一大坨? 关于 VS2010 异常捕获 在线编程教育平台Treehouse推免费iPad应用 微软发布Windows 8.1企业预览版 功能更强劲 如何管理和优化日益增长的代码复杂度? SDCC 2013大会讲师名单议题更新 8月1日前3.8折优惠截止 IBM Rational首席技术官:DevOps是一门哲学 Mozilla联手黑莓推进Web安全技术,推出开源测试平台Minion 苹果如何培养SOHO一族高效工作 再造Ruby:CryENGINE 3.5游戏引擎特性详解 Eclipse基金会涉足物联网,M2M标准是否已获东风? SDN部署前必须考虑的7个事项 【云先锋 40】初创公司DataStax:专注于Cassandra,三年融资8370万美元 内容创作工具的革新:Facebook前CTO推文字处理应用Quip 微软为Android手机推出Office 仅面向Office 365用户开放使用 编程、创业、开源感悟——SDCC 2013讲师云风专访 原生广告:移动推广的热门新宠 隐私之战:金山手机毒霸宣布开放安全检测平台 世界人民的头上有张监控大网——Xkeyscore 美国“监控门”情报收集系统 X-Keyscore 技术揭秘 双喜临门,激动不已啊... 不能在sql语句中调用字符串处理函数,怎么办? 在WAS4.0 AE控制中,启动应用程序服务器的时候,没有装入相应的 Web 模块,为什么? url傳遞參數變量及Form表單提交問題? 关于声音频率 有关数据库的问题,请不吝赐教 怎样将16进制的转成Unicode? 我的XP不能被局域网内其他用户访问 只提一条记录的问题!! 为什么我的ServletContext会出错呢? 上传看不到主页啊???web.config vb+asp.net 很急,在线等待 網頁url傳遞參數變量及Form表單提交問題? 50分! 又是字符串,怎么总与我过不去 怎样把文件写入服务器端中映射的驱动器中,急 在线等。。。 [我贴我灌]世锦赛罗雪娟夺第三金 关于用户离职和升级后的处理? 代码问题,高手进 急,在线等待 DNS服务器的问题,高手救命!!!问题解决不了,老板要我走人了!!!!!(痛哭中 &&&&&&&&&) 鼠标当前位置的值与窗体位置如me.left 的值是怎么样换算的? 英文OS,我加一个中文字库,我要在我的程序中显示中文,该做些什么? 一个硬件问题,来看看吧!问了好多人多不明白 bcb6自带的install??? 简单要求 CSDN出的《JBuilder实用技术手册》到底怎么样呀?我看目录怎么像垃圾? 在jsp怎么取得用javabean连接得数据库中得记录总数 请教各位大师,如何用VB做一个象ComboBox一样的控件 web Service里的Application的问题 有没有能够打印固定行数的报表? 对XML不太熟悉,麻烦大家再看看! 关于bho及控制ie行为的问题, 如何动态的设置datawindow的计算域的表达式,及从程序中如何得到该计算域的值 [我贴我灌]巴塞罗那凯旋归来 “花样姑娘”泪洒观澜湖 一个到现在还没有解决的问题!我着急用啊!请哪位高手帮忙解决了,有高分相送! WIN32 CONSOLE APPLICATION 中怎么调用DLL (动态连接库) 怎么增加不了行,插入不了了?请大虾给个提示 50美元求作业! 如果没有学过C语言,能不能学J2SE啊? 100分请教:一个串行接口通信的问题————在线等待?!!!! 急,给个jb8中解决编辑jsp问题的补丁。谢谢 关于sendmail的设置以及PostNuke的安装 关于XML,XSL的兼容性问题 在SQL SERVER的视图不支持CASE语句吗?若要实现该如何写呢? 现在最标准的软件开发预算,各阶段的百分比是多少? ==========天哪!怎么会这样呢?我在全屏窗口中打开的任何窗口都是全屏显示的,可我不希望在全屏幕窗口中打开的窗口也是全屏怎么办啊?== 如何在远程服务器上安装web服务程序? 考虑到类的属性(表的字段)以后会增加,应该用怎样的设计模式或设计方法。 如何在子目录下获得根目录的网络路径? 急,IE每次打开都是最小化状态,怎样实现每次打开时将其最大化! 祺字一共几画 请区别:细胞髓鞘,神经纤维,施旺细胞,神经胶质 求高人帮忙构思一个内衣品牌故事!想创立一个名叫依纳兰或者尤朵姿的内衣品牌,现在急求高人帮忙构思一个以欧洲爱情故事为主线的品牌故事,必有重谢,满意再加100! 有髓鞘的神经纤维动作电位是不连续的,为什么? 绿松石怎样形成的 王字几画,恩字几画,豪字呢? 有一道辩论题,反方说:我们应该利用湖南的资源来发展我们的经济.我是正方,应该怎么说 所示电路,已知Us=1V,R1=1Ω,R2=2Ω,R3=3Ω,r=1Ω.求图中电压U3. 饺子是中国的传统美食,在很多国家也有吃饺子的风俗习惯,但是所用的馅料有所不同,越南饺子以_________为 如何判断绿松石的质量? 祺字有几画 叙利亚工程师开发新软件 可发短信预警俄险些再发生公交爆炸 一名乘客携炸药美媒:斯诺登仍掌握美针对俄中展开情报外媒爆料超模米兰达可儿与奥兰多布鲁姆王宝强二胎女儿曝光 小萝莉头戴红帽太故宫博物院一食堂发生持刀伤人事件 造故宫回应突发刑事案件 称公安部门正在日本众院委员会出国考察扎堆欧美 10外媒爆料超模米兰达可儿与奥兰多布鲁姆哥国小镇妇女发起“合拢双腿运动”促政日本众院委员会出国考察扎堆欧美 10美媒:中国天河二号超级计算机芯片系英梁维东:要分数更要综合素质最帅岳父小悲催一些油站提前使用国V汽油罗大佑退出《中国好声音》,齐秦接班龙江单车巡游募捐谢霆锋创纪录广东省“桂城杯”诗歌奖落户南海国学老师讲管理 顺商赞“生动”被苏牙咬的概率>被鲨鱼咬的概率
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘