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

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

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
触摸未来:Tactus微流体技术2014年来袭 Windows的未来:一个核心 多个版本 Github项目中使用率最高的Java/Ruby/JS库 2013中国大数据技术大会盛大开幕 从黑色星期五找到的六个规则 帮助网站转化 移动开发者的自学宝典:十大在线编程学习网站 MIT新技术:远程触摸和操纵实物 创新人机交互 中国移动研究院业务支撑研究所所长孙少陵:大数据实时处理技术发展趋势及中国移动实践和展望 “第一届中国大数据技术创新与创业大赛”主办方发言及创新分赛颁奖 中国移动研究院业务支撑研究所所长孙少陵:大会及与会嘉宾介绍 中国工程院院士、大数据专家委员会主任李国杰:能挖掘出价值的数据就是好数据 阿里飞天平台总架构师唐洪:飞天开放平台 百度大数据首席架构师林仕鼎:新计算时代 金山发布全系列IaaS平台 Google无人驾驶汽车与机器人组合,秒杀无人机 Google欲推新Chrome应用:适用于Android、iOS平台 comScore:美国市场苹果手机独占鳌头 Android和iOS双寡头垄断 一周消息树:新技术实现远程触摸和操纵实物 创新人机交互 研发周报:帮助网站转换的六大黑色星期五规则 【开源专访】JFinal作者詹波:以极简方式实现Web项目的极速开发 2013中国智能交通与大数据技术峰会:迎接交通大数据新时代 大数据应用技术(上):加速创新,重塑世界 英特尔百度携手推出首个跨平台应用商店 12月9日:计算机软件第一夫人Grace Hopper出生 触摸屏将成笔记本标配 电脑行业或将迎来又一春 触摸4G,你必须要知道的那些事儿 TIOBE 2013年12月编程语言排行榜:Transact-SQL冲刺年度语言 敏捷开发的6个实战经验 【图文】走近华为企业业务与支撑万人技术团队的云数据中心 《习惯联盟》陈晓冬:与京东云合作让我们没有后顾之忧 流计算与批处理同现:畅享大数据时代的开源实践 以下程序的输出值是 哪位朋友知晓如果Table与DbGrid绑定后,如何实现非第一索引的排序。 请问MSDN有中文版的吗?我们这的全是英文版的 我的 Win2000 出大问题了,急盼各位大虾赐教 请问那里有VB.NET软件下载呀 什么delphi命令可以打开网页呢? 到底有没有人知道如何可以在panel中动态的调用frame或者是form呢? 哪里有windowsXP下载? 送我能给的最大分,请教很小的问题,中高手进 聊天请进(thinkingdog) 大家来谈谈 IBM都有些什么认证???什么认证现在比较吃香???谢谢!!! 打印数窗问题求助! 如何使用UrlDownloadtoFile下载文件使用进度条? 如何用在两次用getTime()中得到两个不同的时间。 一个类似于牛角尖的问题(多余的CONST),不能忽视,请各位高手详细说明!!谢谢! 怎样读写注册表,每次都不成功,气死我也~! 各位救命啊,用 TClientDataSet.Load XML 的问题。。。。 娃呀呀,pb8怎么这么难安装?jaguar组建就用了5分钟,regester window又用了10分钟,重启动后,还没完,偶不敢装了,把碟退了出来,大家是不是也这样?//牛虻 请教高手一个ado的问题. 请问一个TWebBrowser的问题 请问:系统崩溃后,找不到BOOT,系统告诉:DOS基本分区为格式化?无法引导启动! 在VB.NET的tabcontrol上放置AxMSFlexGrid控件问题,急 java3D 现在大家是用Oracle 8还是 Oracle 9??? C++问题求助! 请教一个错误的原因. 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版 SCJP里的那些什么300-020,020是什么意思啊? 请问一个关于document.write()方法的问题。急啊! 初学者,欢迎灌水。 Delphi6的Bug?不兼容? 为什么我用GetProfileString()却总是得不到结果 sos 请教各位大侠一个问题 delphi6中的installShield 请介绍接收端CRC校验传输内容是否正确的方法,资料或代码。谢谢! 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁会做软件狗?有钱赚了!!! 为什么我用QuickRep作的报表只能显示一条记录,而且columnHeaderBand上内容也显示不出来 请问在税务局开发数据库的同行么?? 大家好各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁做过软件狗,马上来拿钱!!! 江苏省的成绩什么时候可以出来啊,我是徐州的 shockwaveflash没有hwnd,怎么办? chechy(chechy) 你在吗? 一个关于用excel做的日报的问题 谁会做软件狗,马上来拿钱!!! 给你下跪了,给你磕头了,给你鞠躬了。很简单的问题。谢谢 那位大哥能告诉我在VC中我要创建类的话应该做哪些工作步骤(要详细的,呵呵) 紧急求救,asp连接mysql问题 在使用twebbrowser的时候,怎样制止网页的自动刷新和跳转? vc编译器错了怎么办???突然死机,然后就不好好干了!!谢谢 压力容器A/B/C/D分类具体是指什么意思?A与D有区别是什么? 不同季节正午太阳光下物体影子的长度有什么特点?为什么? l正午时我们在太阳底下的影子长度比下 午时我们在太阳底下的影子的长度 ( ) A. 要长 B. 不变 C. 要短 D, 一年的正午学校旗杆的影子在旗杆的什么方向为什么 【化学变化】牛奶和醋放在一起有什么变化?再喝下去呢? 射线b级检测,焊缝是否要磨平 某学校操场上,在O处立有一旗杆,OP是正午时旗杆在地上的影子,影子长度经常变化,当6月22日时影子缩短为0.M有棵树,OM与OP相垂直.(1)旗杆所处纬度为_______,因为____________________________,到________ 某地有一幢楼,楼房高度为h,太阳高度角为a,楼间距和正午的影子为S,回答4-5题.4.若在12月22日,正午影长与楼房高度相同,该地的纬度是:( )①23°26¢N ②21°34¢N ③25°26¢N ④68°26¢ 紫铜管钎焊焊缝能用射线检测吗 干冰在人工降雨时所发生的物态变化仔细一点应该好像有四种吧 延长记号是什么样子 “春天的花开,秋天的风以及冬天的落日”是哪首歌里的词 用干冰人工降雨发生了哪些物态变化? 右下图是中国节水标志,用简练的语言写一段解说文字,向同学和家人解说图案的构成要素、造型特点.右下图是中国节水标志,请仔细观察,用简练的语言写一段解说文字,向同学和家人解说图案 从一天当中阳光下的物体的影子的变化发现什么 请问这个焊接符号是代表什么意思?还有a 1.5 是什么意思 音乐中的休止符号是什么样子? 你的家在——,一天当中阳光下的物体的影子是怎样变化的?5年级《寒假之友》4页 急!早晨。上午。傍晚。中午的影子。 通过观察你发现了什么? 这个焊接符号代表什么意思? 俄罗斯东部西伯利亚地区的三大河流,自东向西依次是 二氧化碳气体保护焊能不能焊接压力容器 二氧化碳气体保护焊能不能焊接压力容器我是一名焊工,制造压力容器采用二氧化碳气体保护焊焊接A、B类焊缝成形可以,X光照射也可以,就是厂里没有 若北京天安门广场的旗杆影子最短,求北京时间 纸袋包装的牛奶和普通包装牛奶有什么区别 CO2焊为什么不能焊接压力容器 关于旗杆影子的问题一天中,在早晨,中午,下午分别观察操场上的旗杆影子长度,有什么样的变化?为什么会有这样的变化?在一年中的不同季节,观察中午时刻的旗杆影子,又有什么不同?说出产生 牛奶塑料袋包装的和枕包(纸袋)的有什么区别吗?主要是在牛奶的质量上有区别吗? 焊接压力容器是手工电弧焊好还是二氧化碳气体保护焊焊接好? 太阳光和地面的夹角叫_________.一天中,旗杆影子的长度最短的时间是太阳在最高的位置———中午的时候,. 枕包装的牛奶和塑料袋包装的牛奶有什么区别?比较起来,枕装的比塑料袋装的贵在哪里? 压力容器主体焊缝可以用二氧化碳保护焊吗 在天安门广场上的旗杆你知道哪一天影子最长哪天最短为什么 A,B,C,D级压力容器划分与一二三类压力容器的划分有什么区别 在同一时间,同一地方的阳光照射下,物体的影子长度和物体高度成什么比例 一年之中,旗杆的影子每天12点时一样长吗?什么时候最长 压力容器b类焊缝要百分之多少射线探伤 一年中每天正午阳光下同一物体影子的长度有什么变化 为什么俄罗斯西伯利亚地区三大河流的下游几乎没有农田RT 压力容器筒体对接,平焊缝,纵焊缝,(A,B类焊缝)可以用二氧气保焊焊接? 铅笔影子的长度约是?身体影子的长度约是?是在阳光下测量,铅笔就是一般的铅笔,人是156左右高矮的人, 俄罗斯西伯利亚地区三大河流为何自南向北流? 仿写例句,续写句子.例:春天的雨,细腻而轻柔,给山野披上美丽的衣裳续写 秋天的雨冬天的雨谢, 一天中铅笔的影子的长度是怎样变化的? 在同一时间,同样高度的建筑物,在下列哪个城市中它的影子最长( )A.深圳 B.宁波 C.杭州 D.北京 俄罗斯西西伯利亚地区的三大河流(鄂毕河,叶尼塞河,勒拿河)为什么自南向北流? 仿照例句,再续写两个句子.春天的雨,细腻而轻柔,给山野披上美丽的衣裳;夏天的雷,迅疾而猛烈,为生命敲响热烈的战鼓;秋天的风,_________,________________;冬天的雪,_________,________________. 在同一时间,同样高度的建筑物,在下列哪个城市中的影子最长() A 深圳 B宁波 C杭州 D北京在同一时间,同样高度的建筑物,在下列哪个城市中的影子最长()A 深圳 B宁波 C杭州 D北京 干冰很容易发生哪种物态变化? 袋装牛奶如果放在杯子里加热水热一下,这样会因为塑料袋加热而产生什么毒素嘛? 科学选择题:在同一时间,同样高度的建筑物,在下列哪个城市中它的影子最长?A.深圳B.宁波C.杭州D.北京 为什么俄罗斯亚洲部分的三大河流中下游几乎没有农田 俄罗斯西伯利亚三大暖流自南向北流的原因是?还有两个问题:为啥每3、4月份,三四月份会出现河水泛滥,河流两岸形成大片沼泽地,这是河水不会全部注入北冰洋的原因是?、三条河流下游却没 在同一时间,同样高度的建筑物,深圳,宁波,杭州,北京哪个城市的影子最长 什么季节正午房屋影子最长?太阳斜射在?几次?什么季节正午房屋影子最短?斜射在?几次 中午12点时太阳底下人的影子()A最长 B最短 C不变 牛奶醋需要什么牛奶跟醋混合来喝对减肥比较好! 不同季节正午太阳高度下影子的长度 中午12点在太阳底下人的影子是( ).A最长 B最短 C不变 D无法确认 压力容器一、二、三类是怎么分类的 牛奶倒入醋为什么会发生变化 RT射线检测管道焊缝的防护问题咱是新手,刚来不到一个月.我看这里检测焊缝时候,人在10米外左右,射线头是放在架子上向下对着管子的,这样子不会射到人的么?为什么公司说的时候挺夸张的.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn