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

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

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
Delphi的Bug-Tthread Suspend方法 Email服务器的简单实现-Delphi资料 Hook的制作-Delphi资料 INI文件的应用-Delphi资料 NT中的关闭计算机,重新登陆的实现-Delphi资料 Windows 系统方面-Delphi资料 Windows外壳扩展编程-Delphi资料 避免二次运行-Delphi资料 编程实现文件关联-Delphi资料 编写定制的文件流实现文件读写加密-Delphi资料 采用多线程进行数据采集-Delphi资料 产生临时文件名-Delphi资料 程序不出现在任务栏-Delphi资料 程序缩小为任务条右下角的小图标-Delphi资料 得到 Windows 用户名和序列号-Delphi资料 得到windows临时路径-Delphi资料 得到Windows用户名和序列号-Delphi资料 得到计算机的名字和ip-Delphi资料 得到内存的 Status-Delphi资料 得到上一个激活的组件-Delphi资料 得到在内存中运行的所有应用程序的handle-Delphi资料 调用控制面板项目大全-Delphi资料 动态改变当前显示模式-Delphi资料 动态改变屏幕分辨率-Delphi资料 动态建立不常用的对象-Delphi资料 对控制面板进行操作-Delphi资料 返回程序执行参数-Delphi资料 防止 Win95 显示严重错误-Delphi资料 改变操作系统日期-Delphi资料 改计算机名-Delphi资料 关闭 Windows-Delphi资料 **********四大网站被黑!!!********** 怎麼寫這兩條SQL語句;(1)顯示當前數據庫?(2)顯示當前所有用戶表? 急,謝謝 送分问题,绝对给分! 如何才能不改变字体大小? 数据窗口有bh(编号),name(名称)两列,编号是string型,用什么方法可快速查找出bh中的最大值?只准对数据窗口操作。 delphi(dll) 大话爱情大结局 ??如何编写邮件服务器? createfont怎样创建一个随意宽高的字体? 急,请问有函数可取字符串后面N位字符吗?在线等待 怎样显示报表页总数问题 在打印中如何实现实现小计(即每页显示金额的总和)100分 问一个简单的问题,关于初始化 请问谁有动态树状目录的原码啊,急需!! 什么问题,怎么解决? 西瓜:有人要求我贴你的没穿外套没穿鞋子的照片 就是你说生气的那张 贴不贴啊? 怎样将一个十进制数转换为二进制数,并将二进制数中的每一位单独取出来? GetProcAddress在VB中的使用? excel单元格格式问题 用按钮保存网页的问题 用c++ builder和access.数据表中的记录多了之后,应用什么方案将之备份以及恢复? 以下ASP在Win2000server上运行报错请问大家为什么??? 在指定位置输出文本 怎么办? 如何启动和终止一个NT服务 .Net——又一个起跑线 怎么样注册jsp上的jdbcoracle驱动 什么问题,怎么解决? 我的爱情大结局----失败爱情原闯文章 在学习了2个月的delphi后,总结四大问题! OnPaint()的问题?为什么我的程序要刷很多次才能得到正确的结果? win2000 Server中的终端服务问题,急,所有的终端都趴下了! 深入浅出MFC 100分﹕vs.net正式版的產品密鑰 怎样动态改变下拉框中的值? 如何将已有的程序(有源程序)封装成ActiveX控件? 讨论一个数据库建模的使用工具问题? 关于Flash的Action的小问题 怎样为xslt中的超联接加上参数? 问题 如何设置datagrid行背景颜色? 安装程序安装完运行显示“运行时错误'380':无效属性值”是怎么回事? win2000+ms proxy 2.0问题 API函数 ReadFile的pb的中文说明谁有,告诉我好吗? 在线求助 在线等待,急 关于计算字段,急! datawindow的scrollvertical.setrow,不能触发rowfocuschanged事件,why? help:can you tell me how can i get the IDE of WinSDK? 有些人的言论很具有误导性,根据今年的就业形势,软考证书还是比较值钱的 请看这段代码?谢谢 甲班学生不满50人,在一次课外活动中,参加各类运动的占全班人数的三分之一,下面还有参加绘画的占全班人数的七分之一,参加唱歌的占全班人数的二分之一,余下的参加跳舞,参加跳舞的有多 假如你是某一地方政府的决策者,你觉得作为农村可以通过哪些途径改变农村人口大量向城市迁移的现状呢?(写一篇500~1000字的作文) 如图,从无阴影的正方形中选一个,与图中5个有阴影的正方形折成一个正方体的不同选法有( ) 公园里都有什么生物,生活环境是什么?(急!只要两个,生活环境就是土壤什么的. 请你自定方案,测量假期中每天上午9点的风向,作好记录.我想问的是,谁能够提供一下1月25日~1月31日的风向,我前面还没有做到,所以没有仔细看题目,现在我一个朋友问我这个问题,好的有重赏! 《书虫英汉对照读物》的读后感两篇,最好有中文对照! 各种生物的生活环境请在植物、动物和其他生物中各选5个(两个以上也可以)来介绍其生活环境和生长状况 红光小学五年二班选两名班长.投票时,每个同学只能从四个候选人中挑选两名.这个班至少要有多少学生,才能保证有8个或8个以上的同学投了相同的两名候选人? 选择:5个同样大小的正方体组合成一个图形,无论从哪个位置观察都至少能看到( )个正方形.①1 ②2 ③3 初一寒假作业P26的25题《苍蝇的路程》?2011. 某班选两名班长,投票时,每名同学只能从4名候选人中挑选3名,这个班至少应有多少名同学才能保证至少有8名同学投了相同的两名候选人的票? 如图,共有12个大小相同的正方形,其中阴影部分的5个小正方形是一个正方体的表面展开图的一部分,现从其余得小正方形中任取一个涂上阴影,能够成这个正方体的表面展开图的小正方形有几个 某校在一次课外活动中把学生编为9个组 若每组比预定人数多1人 则所需学生超过200人 若每组比预订人数少一人 则所需学生总数不到190人 求每组学生预定人数是多少? 一元一次不等式组解 某班要从11名侯选人中投票选举1名班长.如果没名同学只能投票选1名候选人,哪么这个班应该有多少名学生.才能保证必有4名或4名以上的同学投相同侯选人的票 要有算式 深圳报业集团2013寒假作业七年级上册英语答案 某校在一次春游中把学生编为9个组,若每组比预定的人数多一人,则学生总数超过200人;若每组别预定少一人 给你这个图形的三视图,如何知道这个几何体有几层?如何球这个几何提示有多少个立方体组成的希望可以给我帮助啊 如图是5个大小相同的正方形组成的图形能否用一条直线将图分成面积相等的两部分(两种)图形:一个大正方形(是四个小正方形组成的)右上方还有一个小正方形 生物的生活环境是指什么A.生存地点 B.影响生物生活的非生物因素 C.影响生物生活的因素 已知一个立体图形(由大小、形状完全相同的小正方体组成)的正视图和俯视图(三视图里知道两个)请问这个立体图形最多由多少小正方体组成?最少?具体说来,是解题的基本策略。 体育室有篮球21个,足球的个数比篮球个数的3倍少8个,又比排球个数的2倍多5个,那么足球和排球各几个?列方程解应用题 设x. 如果好,我会提高悬赏分数. 怎样由三视图判断几何体或几何体组成的小正方体个数?别用什么层、列、行的,我看不懂,最好有图,三视图这一块我一窍不通啊!我的意思是由主视图,左视图画俯视图或由主视图俯视图画左 体育室有篮球21个,足球的个数比篮球个数的3倍少8个,又比排球个数的2倍多5个,足球和排球各有几个?要列方程的 上图反映的是某校六1班学生在课外活动中参加各种兴趣小组的情况,用什么表示全班同学的总人数,用什么表示参加各小组的学生人数占全班总人数的百分比.2.参加舞蹈小组和美术小组的学生 2014七年级寒假作业答案? 体育室有篮球21个,足球的个数比篮球个数的3倍少8个,又比排球个数的2倍多5个,那么足球和排球个几个?(方程) 某校参加全市中学生篮球比赛,共参加了16场比赛积28分,规定一场积2分,输一场积1分 该学校对胜,负各多少 2014寒假作业答案七年级 书虫·牛津英汉双语读物:曾达的囚徒答案 小学作文写人的(同学)要求400字,半命题,小______如:小淘气,小机灵支持复制.汗- -不是考试,练笔,要我自己写的就别来灌水。 聪聪同学做了这样一个游戏,她在地上任意画个△ABC(如图所示),并作出了∠A的平分线与BC的垂直聪聪同学做了这样一个游戏,她在地上任意画个△ABC(如图所示), 并作出了∠A的平分线与BC 轻松快乐过寒假六年级上的英语教教我!练习八的第二大题,练习九的第一、二大题,练习十的第一大题,练习十二第一、二大题,练习十四的一、二、四大题,练习十五的第一、三大题. 小学四到六年级以上的孩子推荐哪些课外读物比较合适? 篮球赛比赛规则--视频解说 电子跳蚤游戏盘是如图所示的三角形abc电子跳蚤游戏盘是如图所示的△ABC,AB=AC=BC=5.如果跳蚤开始时在BC边的P0处,BP0=2.跳蚤第一步从P0跳到AC边的P1(第1次落点)处,且CP1=CP0;第二步从P1跳到AB “起飞”的英语怎么说? 三人制篮球赛竞赛规则 由五个正方体拼成的立体图形,从上面看到的形状是横着的三个正方形,从侧面看到的形状是竖着的三个正方形那么从正面看到的是什么形状 起飞用英语怎么说 6个面积完全相等的正方形围成的立体图形就是正方体 一个立体图形,从上面看的形状是4个连着的小正方体(两横两竖),从正面看的形状是竖着两个,横着1个.最多需要几个小正方体,最少呢? 一:有趣的人体喻词1:骨肉 1:喻指真诚.勇气口齿 2:喻指说话的本领喉舌 3:喻指技艺.本领肝胆 4:对人和事的感情咽喉 5:喻指头绪.条理首脑 6:喻指最亲的人皮毛 7:喻指重要的人物腹背 8:喻指暗 2010年某地区的篮球队共进行了22个场次的比赛,比赛规则:胜一场积2分,输一场积1分.小蜜一直在关注比赛她认为会有一个球队出现胜场积分等于负场积分.你认为可能吗?用一元一次方程) 用四个正方体拼成一个图形,使之从某一个方向看到的形状是两个横着的并排正方形 小学四至六年级语文必知的课外知识?急 某市中学生篮球联赛规定:每队胜一场得2分,负一场得1分,实验中学队15场比赛得分24分,问该队负了几场?要过程(方程) 明明和聪聪每人有30张卡片,明明给聪聪5张后,聪聪比明明多多少张? 常熟市08年六年级语文课外知识能多则多,要有用的,可能考到的! 镜湖小学六(8)班的同学准备选编一本自己的文集—《让我们荡起双桨》,他们对作文进行编辑、分类,设计了“感受生命”、“体会亲情”、“走进名人”等栏目,请你再设计一个栏目.要求 想写一篇作文的提纲 写人作文的不要太长 明天就要用 今天,刘慧,靳娇和婉玉来到我家.因为我在学校常常和他们玩,也算是死党了!所以,我们马上“嘻嘻哈哈”的疯成一团……今天,我就为大家 比如说什么[猜字谜]、[成语知识]啊.(要在六年级知识水平以上的,我要做幻灯!) 一个立体图形从上面看,形状是3个连着的小正方体(横排),从右面看,是三个连着的小正方体(竖排).问:搭这样一个立体图形至少需多少个小立方体 最多需多少个? 原题是多选题 A:4个 B:5 六只篮球队,若采用主客场双循环比赛.则需要安排比赛的场次为? 语文课外知识!小学六年级的!快要升初考了!我急呀!记得加答案!谢谢大师! 用7个同样的小正方体搭成一个立体图形,从正面.后面.左面.上面.右面看都有5个正方形,怎么搭?需要几个? 六个篮球队进行单循环比赛,每两队都要赛一场.如果踢平,每对各的一分,否则胜队的3分,负队的0分.现在比赛已经进行了4轮(每队都已与四个队比赛过),其中有四场球赛踢成平局,并且各队四 还有什么在花园中的生物?有哪些特点? 一立体图像,正上方可看到五个小正方形,右看两个正方形,如果搭这样的立体图形,需多少个小正方体? 求 “书虫· 牛津英汉双语读物《 园会The Garden Party and Other Stories 》 的读后感作者大卫·科波菲尔 David Copperfield
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘