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

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

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
“2013年度中国优秀开源项目征集”活动最后三天 为什么开发者倾向于使用杂乱无章的免费工具 EMC合作伙伴销售经理杜术清:实现云的三种途径 开发者想走向海外:你融入老外的圈子了吗? 前微软工程师:美国监控和直接访问服务器?这不太可能 代码、TDD速查表 如何选择前端架构:服务器端HTML vs. JS部件 vs.单页Web应用 世界上最高深的Android特洛伊病毒 招聘iOS开发,老板必问的5个问题 护航科技吴伟湘:IT离线安全体检服务将带来颠覆 百度王继平:移动互联网时代云平台思路 “第八届开源中国开源世界高峰论坛”火热开启 微软发布SQL Server 2014预览版,展示内存数据库技术 帮助软件开发者提高效率的10个小窍门 我想做个程序员:Technovation Challenge圆女孩编程梦想 未来我们开发的Google Glass应用将会是什么样? 独家:前RIM大中华区总经理刘征宇,加入Appconomy 用一个API搞定一切 Segment.io为移动开发者提供便利的分析数据分发服务 TIOBE 6月编程语言排行榜:JavaScript回归前十 《Kingdom Rush Frontiers》上线后 迅速抢占27个国家游戏榜首 移动周报:85后程序员,iOS开源项目,细数7天大事件! Instagram:从Redis到Cassandra 成本节省1/4 乐元素CTO凌聪访谈:游戏引擎技术选型之王道 iOS 7的新设计并非止于外表 WWDC 2013大会10大启示:正向开发者支付大量现金 云计算大会微软专场成功举办 Windows Azure公众预览版上线 IBM全球大裁员 在美国裁员已经开始 动动鼠标,决定“中国十大优秀开源项目”的归属 为改善Flickr 雅虎收购拍照应用开发商GhostBird 让你轻松学习新代码库的六个步骤 RESTful API 设计最佳实践 代理Type分别为transparent,anonymous,high anonymity,优劣? 为感谢computersim在大力相助,特奉送100分,快来拿啊 请教网上书店系统的设计思想和例子。 VC中使用FLASH的OCX控件如何取得Movie的原始大小,且如何按指定比例缩放?问题解决后必给分。 有关“隐藏”,“覆盖”的一些问题: 如何把A库中A表原样复制到B库中去? 怎样取得鼠标点击DataGrid控件时是哪一行,哪一列呢?(C#) ISA 2K发布多个WEB 服务器问题,(我都要疯了)高分求救 这个问题怎么办?? (ADO OPEN) Up 有分! 母亲生日,你觉得送什么礼物为好? 用c++ 写的 hello 程序在unix g++ 编译通过后,运行出错 如下几个初级问题要问,高手们请进-> SQLSERVER高手进来聊聊........ 怎样用代码实现两台电脑之间的文件传输? 哪位知道Microsoft Firewall Client 的下载地址? 关于RECORDset的问题,求教 如何在web页面使用 Windows 窗体控件,最好有例子! 使用DOM的XMLHttpRequest对象来发送xml请求,但当返回的响应带有中文时候,在PDA上无法正常显示,我使用MultiByteToWideChar也没用。有人 请问在窗口中放置控件时,PB是否有靠近格线对齐的功能。如果有,在哪设置? DELPHI中FASTNET组件使用方法 请问在SELECT查询中怎样娶得行号? 在一般的类中如何得到当前文档的指针? 巨菜问题:重装xp后grub启动菜单消失,怎么办? FIP上传问题,非常着急,在线等,解决就结贴, 用javaScript打开窗口后,原窗口的gif动画不动了 FindWindow的用法 反正没几个人能回答,发来玩玩。 在当前文档中如何实现刷新操作? 构造sql语句时,表名或字段有可能是sql的保留字段,如何解决? 小弟急需文件操作和线程管理方面方法技巧的资料,望各位英雄赐教 怎么将power point打包成exe 如何恢复execl中vba的密码 怎样在ISA中设置带宽限制? 如何实现数据库的更新?? 搜胡首页是<<美英百架战机空袭伊拉克 攻伊序幕已拉开>>,但... string 读取的问题。 正在看c++primer的请看(高手当然也能看拉) 有哪位高手用过bcp_exec导入数据吗? vb数据库安全问题 大学新生师弟师妹们很快要来报告了,大家能不能帮我想想一些迎新的宣传标语? 数据窗口中dddw下拉前触发的事件是哪一个(使用pbm_dwndropdown无效)? 有关的vs.net的简单问题! 下周可能要去勞動局!矛盾激化! 博士,硕士,教授等请进,关于前途的问题: 如果明天csdn也被封了,我们还能做什么???? 请问SQL SERVER区分大小写吗 关于lcc-win32 winme下如何调整显示器的刷新率 大家练练手,征集下面这个小程序的算法!!!(很有趣的阿!!) 消失的古代王朝---亚述 Web services 的应用。 请问大一无机化学中电动势为何一定要这样表示:E(Cu离子/Cu),有什么含义吗? 连词成句.We,music,on,have,and,P.,E.,Wednesdays(.) 奥运五环为什么红色代表美洲,蓝色代表欧洲请看清楚问题. 环太平洋里面提到机甲,会说像是“也噶”一样的音,单词是怎么拼写的? 影响铁吸收的因素有哪些? 减法运算的意义是什么? “冧”字噶拼音系?.. 磷化膜很光滑会对喷塑涂层的附着力有影响吗?划格试验还没有用胶布,涂层一吹就脱落了,脱落涂层下面钢材很干净,无油无锈.烘烤温度也加高了还是不行,影响因素有哪些?钢材、磷化、塑粉、 有理数减法的定义 先回24字的采纳,要是一句话. 喷塑附着力问题附着力差 关于中国历史上所签署的各个不平等条约的时间,地点,原因,以及影响在中国18世纪中后期到辛亥革命时签署的所有条约都对中国造成了很大的影响,那么他们的时间,地点,原因,影响分别是什么 先回23字的采纳,要是一句话. 有哪个兄弟知道,测量喷塑漆层附着力的工具是什么啊?以前见过,不知道叫什么名字,类似螺纹塞规的样子. 英语翻译刚开始进公司的时候,我协助经理组建销售部门,我的主要工作是收集市场信息,走访相关企业,了解市场供求信息,并写市场分析报告.之后我开始负责公司项目推广工作,主要是定期召开 Cu在化学中代表什么 一定量的Na2CO3和NaHCO3的混合物跟足量的盐酸反应,共耗酸0.8摩,生成CO20.5摩,求Na2CO3`NaHCO3的质量各多 ‘升’字的英文翻译? 先回先采要有15个字的一句话. 吸盘式挂钩只能挂在玻璃上的原因 铁元素在食品中生理功能 化学式Cu能否表示分子? 为什么NaHCO3 ,Na2CO3与酸反应时,NaHCO3反应的更剧烈? 影响Fe吸收的主要因素有哪些? 晟 这个字的拼音是什么?这个字的拼音是什么? 这幅图你能看到几个字?听说最多的能看到18个字. 这个用系统命名法怎么念?为什么不念做3,5-二甲基-5-乙基庚烷? ‘晟’这个字怎么念?拼音和几声?不好意思,我身边没有字典,又遇到这个平时不用的字,谢谢帮助者. 求一张写着字的图片.上面写着一句话的就是张爱玲的那一句"明明不相干的,也会在心中拐好几个弯想到你"把图片贴出来或者把网址交出来~额.是手写的. 系统命名法问题2-二甲基戊烷对吗?是不是应该写成2,2-二甲基戊烷 Na2CO3和NaHCO3与酸的化学反应速率那一个快一些? 如果这幅图旁边要配上一句话或一个词,大家认为配什么好一些?最好是偏现代些的,不要太长,一句话或一个词,也可以是小说动漫电影各种各种的语录什么的,也可以是原创的,只要合适意境, 关于系统命名法的问题命名时-CH2C(CH3)3和-CH(CH3)CHCH3哪个在前面?前一个更大,后一个取代基的取代基更靠前打错了,是-C(CH3)2CH2CH3和-CH2CH(CH3)CH3 这个字“晟”读什么? 图像PS,一句话前面加几个字,急帮PS一下,把请你吃哈根达斯改成请全班吃哈根达斯,急 噶的读音 Na2CO3和酸反应生成等质量CO2消耗的酸一定比NaHCO3多吗?除了盐酸外,还有其它酸可以和NaHCO3和Na2CO3反应? 准噶尔盆地和塔里木盆地的成因是什么? 噶的读音为 请用下列两个词各写一句话造就;练就; 几个字或者一句话加上一个美女的图,叫什么像这个 准噶尔盆地 怎么读 为什么淋巴细胞所处的内环境是淋巴和血浆,毛细淋巴管壁细胞的内环境是淋巴和组织液 请用下列两个词各写一句话.急造就;练就; 奥运五环中的绿环代表的是澳洲还是大洋洲?越详细越好,最好把国际规定也弄上来. 淋巴细胞生活液体环境是淋巴血浆,为什么不像毛细淋巴管壁细胞液体环境内有组织液?毛细淋巴管壁细胞和淋巴细胞有什么关系?淋巴细胞生活液体环境是淋巴,血浆,却没有组织液,而毛细淋巴 Cu 可不可以表示 铜元素但我觉得可以 三个不平等条约的签订对近代中国社会性质的影响是什么 组织液是怎样进入淋巴管的?淋巴为何又是单向到血浆的? Cu是什么元素 电磁吸盘吸在玻璃上为什么要排干空气 雅鲁藏布江,该河谷地处 板块和 板块交界处,因此 资源雅鲁藏布江,该河谷地处 板块和 板块交界处,因此 资源丰富.这里农业发展类型属于 农业 4Cu4Nb是什么意思,cu,nb,是代表什么元素的 ps中ctrl+shift+6什么意思? 雅鲁藏布江流域处于板块交界处,但火山活动较少,其原因可能是 近代中国第一批不平等条约 名称和内容 ps里ctrl+a+c+v是什么意思? 化学名称Sb、Cu、Mn、Zn各代表什么金属 列举近代签订的不平等条约的名称 有理数减法概念谁能给我一些有理数减法的概念,越多越好,
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘