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

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

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
[简讯]新代码编辑器Lime发布 号称Sublime Text的开源实现 从真实案例出发:如何在协作开发中避免误解! Google工程师谈程序员的自我修养 依然很强大:微软第一财季净利润同比增17% MDCC 2013垂直行业应用与O2O专题论坛透露劲爆话题 专访豌豆荚产品设计团队:Design Hackathon是绞尽脑汁之后的海阔天空 首日报名爆满超300 向C++大师Lippman提问征集 做华为合伙人:华为开发者联盟沙龙(北京站)即将开幕 Windows XP发行12周年 我仍年轻而你已垂暮 2013浏览器市场份额:Chrome领衔,Firefox、IE相去甚远 人人网陈弢:从RecSys2013看大数据和移动给推荐系统带来的挑战 继续紧逼Oracle:在占领谷歌等公司之后,MariaDB迈向企业端 移动周报:十款最实用的Android UI设计工具 阿里巴巴CTO王坚:开发者精神是云计算与移动互联网的“信仰” 黑客老鹰:安全软件同样需要用户体验 六届中国大数据技术大会PPT精粹(二) 专访百度蒋凡:从RecSys2013大会看推荐系统发展新趋势 Hike副总裁杜中强:携手阿里云OS,拥抱云时代 玩蟹科技CEO叶凯:手游和云计算的合作相得益彰 倒计时20天!金玩奖各大奖项花落谁家由你主宰 宅男程序员福利:来自纽约的28位智慧与美貌并存的IT女神 创季度记录:苹果发布第四季财报 iPhone仍是苹果商业心脏 在破晓中行走:一位盲人开发的盲人应用 腾讯云俱乐部成都站——云时代手游开发:用数据说话 首届微App峰会将在MDCC2013上举行 微信易信百度新浪等平台开发商云集 TUP Masters第七期:C++大师Lippman论编程新范式Hugo OpenCL用于13个微型计算机领域的经典案例 从测试数据来看Node.js和Java EE的性能区别 工作效率低下?业内人士建议你切勿追求完美 Mozilla发布可视化在线跟踪工具Lightbeam 望向海外:十大移动应用开发外包公司 关于事务 LIB 在线等!!!!!!!! ADO+SQL Server 如何用VB编写发邮件的程序? 数据库搜索的一个怪问题 怎么得到从另一个页面传来的参数 Full Text: Bush Speech Aboard the USS Abraham Lincoln 请问 怎么实现变量互换阿 我是新手~~~ FAT错误,请问如何修复? flashget那个小方框怎么做? 谁有《UML与Rational Rose2002从入门到精通》书的选配光盘 急!!!随机函数 FAT错误,请高手帮忙修复。 内部消息(我对我说的负责) 不定时开放FTP服务器 急,求救!!! 一个很简单的问题. 为什么 “基本图象处理代码(1) ehom(原作)”对grayscale不对? linux下的oicq 有马? 帮帮我,好吗,感谢,非常 help,help,sql query question? 大家认为考研考进其他学校(且跨专业)的可能性有多大 显示图片 数据库搜索的一个怪问题 共享上网问题!急~!!!! 句柄和指针有什么区别吗? 大虾快进来,帮帮兄弟们!!!再现等待!高分!! 请问C++Builder的程序中能不能使用*.mdb类型的数据库? 帮帮忙!!个位大哥 请问用java编程能实现数据采集的程序并进行传输(即c/s模式)吗? 请问什么命令找开一个窗体的? 请问:如何从文件中获取icon并得到HBITMAP句柄? 如何在客户端打开一个word文件 MVP是个什么概念???? linux启动不了,Bringup loopback interface时出错,请问是什么原因? 帮帮忙!! 我海军一艘潜艇失事 70名官兵不幸全部遇难!! 明天朋友结婚,征集整人的法子 是谁删除了我贴?? 而且没有跟我说一声!!! 白天工作,晚上溜狗,爽呀!比大暑天喝了冰镇雪碧还爽! 我的jsp服务器是iis+TOMCAT+win2000pro 不知怎的每次用不了多久就显示出 网页无法显示 目前访问该 Web 站点的用户过多,我只是自已用怎么 终于有星了,高兴,散分(第一次散分,请斑竹手下留情) 我的刚装的2000进入启动界面时,进度条读到2/3时就蓝屏了! 请问在运行时向ActiveX控件中添加ActiveX控件的方法是什么? 高手请进:如何在WinNT以上系统进行BIOS读取! 毕业设计的问题,请各位大哥帮小弟一个忙 备份与恢复 数据备份与恢复 我用win2k,下载了php4.3.1,extension_dir是c:\php\ext 可是里面没有php_gd.dll,怎么办,到哪里可以down一个补上? 帮我一下:解决中文问题 新手问题:怎么在用ATL COM WIZARD已生成的dll加入MFC 小明家进行装修,厨房用边长0.2米的方砖铺地需要200块,客厅面积是厨房的3.6倍,客厅面积是多少 要分步的 成行的 带单位的 李叔叔平均一步长约70厘米,他绕着一块长是宽2倍的长方形的边沿走了一圈,正好走了900步.求地的面积? 质量316g的铁块,体积是多少、(P铁=7.9×10三次方kg/m三次方—) 小屁孩日记4的主要地点有什么 一种香菇的含水率为80%,烘干后还剩( )% 若该项试验始终在黑暗中进行,有机物含量不断减少,原因是 小屁孩日记的四本都讲了什么从第一本开始到第四本,一本一本讲,这本都讲了什么, 有一块正方形地,边长是20米,在它的中央有一个圆形花圃,直径是8米,现在要在花圃周围修一条最宽的环形路,剩下部分种草,求路的面积和种草部分的面积. 幼苗体内的有机物含量在黑暗中不断减少的原因(两点) 帮忙翻译这个单词 一块正方形田地,边长为20米.在它中央有一个圆形花圃,直径是6米,在它周围修建一条最大的环形走到.剩下的四四个角也建成花圃,花圃的总面积是多少? 秋天温带地区植物的树叶落下的主要原因是为了降低 A蒸腾作用 B有机物的消耗 英语翻译 有一块正方形地,边长是20米,在它的中央有一个圆形花圃,直径是8米,现在要在花圃周围修一条最宽的有一块正方形地,边长是20米,在它的中央有一个圆形花圃, 直径是8米,现在要在花圃周围修一 小李以一定的初速度将石子向斜上方抛出去,石子所做的运动是斜抛运动,他想:怎样才能将石子抛得更远呢?于是他找来小王一起做了如下探究:他们用如下图所示的装置来做实验,保持容器水 猴子吃辣椒—( ) 汽车以1米每二次方秒的加速度启动,同时车后60米初有一人以一定的速度V0匀速追赶要 有一块边长是8米的正方形的地,在它的中央有一个圆形花圃,直径是6米,在花圃的周围建一条最大的环形在花圃的周围建一条最大的环形走道,剩下的四个角,种植成草地.求建成的环形走道的面 猴子吃辣椒——抓耳挠腮的意思它的意思~就是为什么这么说- - 写一篇英语作文,要求:写自己喜欢的运动 有一块正方形地,如图所示,边长是30米,在它的中央有一个圆形花圃,直径是20厘米.现要在花圃周围修筑一条最大的环形石子路,请你在图上画出这条环形路,并求出环形路的面积. 孙猴子吃仙桃—( )范进中举—( )烂网打鱼—( )猴子吃辣椒-()帽子烂了边-( ) 黄鼠狼的药用价值 新鲜香菇的含水率,和香菇的成熟度有什么关系?是不是越成熟含水率越高? 排球有几种颜色? 问题:黄鼠狼肉有药用价值吗 修 改病句制度的优越、国力的强大是中国撤离在利比亚人员行动能否取得成功的坚实基础.学校开展的“感恩、奋进”活动,掀起了同学间互帮、互助、互学、互进,增进了彼此的友谊. 问:排球技术有几种?分别是什么? a cup oftea和a glass of milk还有He is 先回答的是最佳 这片土地是圣神的 悠悠球洗轴用汽油怎样洗轴? 萧山游乐场内有一块半径为5米的圆形空地,先计划在他的中央修建一个半径为3米的花坛,剩余部分铺成观光路求观光路的面积 这片土地是圣神的主要内容 悠悠球用汽油洗轴洗完轴晒干后 加润滑油吗 游乐场里有一个圆形湖,湖内有一圆形湖心岛,最初岛的面积是环岛水面面积的1/3,由于旅游的需要,湖心岛进行了扩建,面积增加了3454平方米,此时岛的面积占整个圆形湖面积的9/25,则圆形湖的周 he still hasn't got used to___ (live) in the city since he came here 3 years ago. A :Do you happen to know what's on after the news B:--------------------------------A :Do you happen to know what's on after the news B:--------------------------------------------a there is no important news after that.b it's a documentary about ani 她有一张小嘴 用英语怎么说急 he ofen came to see me ---he live here A.while B.since 及解析live改为lived 厚的四字成语 我有一个樱桃小嘴英语怎么说? 第二题,B项里在最高点时向心加速度为零吗? 我梦到牵着一只猴子,还拿鞭子打它 干香菇大的好还是小的好 急.若a÷1/2=b÷4/3=c÷5/5,且a、b、c都不为零,试比较a、b、c的大小,并说明理由.如上若a÷1/2=b÷4/3=c÷5/5,且a、b、c都不为零,试比较a、b、c的大小,并说明理由.要比较,以及理由,快 梦见猴子:梦到老公被猴子咬到,而我在拿着鞭子追打猴子 无法拍摄的情况,我要一个科学的解释.我要的是自然或物理现象!( 拍摄工具正常,用法正( 拍摄工具正常,用法正常,对面的人正常) 我想问的不是怎样拍好而是怎样干扰 做匀变速直线运动的物体,在第2 s内位移为6 m,第5 s内位移为零,则其初速度是______m/s 汽车以1m/s∧2的加速度启动,同时车后60m远处有一人从一定的速度v.匀速追赶车停下,已知人在离车距离小于20m,持续时间为2s喊停车,才能把信息传给司机,问(1)v.至少要多大?(2)如果以v.=10 懂鸟类的朋友来帮下忙!看看这是什么鸟! 求解释关于合力分力的问题 如图所示,挑水时,水桶绳子分别为a,b,c三种情况,哪种情况下绳子最容易断 把下面的单词(20个)翻译成中文1. Honey Apples2. Pork Egg Rolls3. Chicken Egg Rolls4. Chinese Tofu & Broccoli Egg Rolls (Vegetarian)5. Chinese Vegetarian Egg Rolls6. Chinese Potstickers7. Melon Shells Filled with Fruits8. Red Bean Soup9. 液压缸下坠 如图所示,a,b,c三根绳子完全相同,其中b绳水平,c绳下挂一重物.若使物体加重,则这三根绳子中最先断的是 英语翻译public limitations on land 干香菇的利润怎么样 挑水时,水桶上的绳子的状况分别是abc三种.则绳子在__种情况下容易断些c在最低处.所成的角度最大 a在最高处 所成角度最小 Find a good way to the end,don`t worry about the 香菇干怎样弄干的 用绳子系住水桶提水,手受到竖直向下的力,它的施力物体是A水桶B绳子C手D地球 伊朗和国际机构就伊核问题对话 外界期美国监听借口难服众 欧洲回应着手协调美国制造业和楼市数据显示经济成长动力美参议院情报委员会主席:白宫将停止监韩国向美国求证是否监听朴槿惠 美方尚伊朗和国际原子能机构继续就伊核问题对郎朗被任命为联合国和平使者 成第二位西班牙对美国监听表不满 闭门召见美大墨西哥自2001年以来首现霍乱疫情 美国在罗马尼亚部署反导系统 巩固在黑卜拉希米访叙将劝反对派统一组团参加日暴风袭击西欧大部致德国七人死亡 英法以色列将释放第二批26名在押巴勒斯坦印媒:印度调整中国战略因不喜欢给中国英首相:媒体爆料美监听丑闻是“资敌”韩国向美国求证是否监听朴槿惠 美方尚12岁黑客入侵加拿大政府网站 辩称仅《纽约时报》著名专栏作家托马斯:上海被控杀死杰克逊者出狱 称为谋生计想当圣马力诺执政官会见王毅王毅同圣马力诺外长瓦伦蒂尼会谈马晓春:何不让男棋手按钟?张光荣:继续以更高标准更严要求抓好第新疆交警爱心接力护送102名农民工返1 9月财政收入石市全省第一 粮食总昨日高考报名首日 老师提醒考生们切记西宁市“向人民汇报请人民评议”活动速“禁卡令”一出 年历生意入寒冬 多数河北省雾霾健康影响监测方案出炉 监测PM2.5对健康影响有多大 我省启动河北集中整治酒后驾驶和工程运输车交通兴海培育40个生态畜牧业合作社河北今年接待入境游客已超百万 东南亚大通认真落实各项就业扶持政策祁连:加大投入出实招 教育优先显成效格尔木节水型社会试点工作通过水利部验科比总得分有望超贾巴尔? ESPN:六方会谈美方团长访日 或加大对朝鲜制陈德铭:相信台湾人很文明 不担心会对宁波菜场蔬菜价格下跌省技术创新能力百强企业发布 12家甬宁波今年前10月进口食品总体安全
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘