C++面试题重构_第1页
C++面试题重构_第2页
C++面试题重构_第3页
全文预览已结束

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、重构一、何谓重构视上下文不同,重构这个词语有两个不同的含义,第一个定义是名词形 式:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下, 提升其可理解性,降低其修改本钱;第二种定义是动词形式:使用一系列重 构手法,在不改变其可观察行为的前提下,调整其结构.曾经有人问我:重构只是整理代码吗?从某种角度上说,是的.但我认 为重构不止于此,由于它提供了一系列高效且受控的代码整理技术,自行运 用重构技术后,我发现自己对代码的整理比以前更有效率.这是由于我知道 该使用哪些重构手法,也知道以怎样的方式才能使用他们将错误降到最少, 而且在每一个可能出错的地方,我都加以重构.我们的定义还需要向两方

2、面扩展,首先重构的目的是使软件更容易理解 和修改,你可以在软件的内部做很多修改,但是必须对软件可观察的外部行 为只造成很小的变化,甚至不造成变化,与之相对应的是性能优化,和重构 一样,性能优化通常不改变组件的行为除了执行速度,只会改变其内部 结构,但是出发点不同,性能优化往往使代码更加难理解,但为了得到所需 要的性能,你不得不这样做.二、为何重构1、重构改良软件设计,如果没有重构,程序的设计会逐渐腐烂变质, 程序将逐渐失去自己的结构,程序员愈来愈难通过阅读代码理解原来的设计, 经常性的重构可以帮助代码位置自己该有的状态.完成同一样事情,设计不良的程序往往需要修改更多的代码,这常常是 由于在不同

3、的地方,使用完全相同的语句做同样的事情,因此改良设计的一 个重要方向就是消除重复代码.代码越多正确的修改越困难,你在这里做点 修改,系统却没有像预期那样工作,由于你没有修改另一处一一那的代码做 着几乎完全一样的事情.如果消除重复代码,你就可以确定所有的事物和行 为在代码中只表述一次,这是优秀设计的根本.2、重构是代码更容易理解,一开始重构时,你得代码可以正常运行, 但结构不理想,在重构上花一点点时间,就可以让代码更好的表达自己的用 途,这种编程模式的核心是准确的说出我想要的.3、重构帮助找到Bug.4、重构帮助提升编程速度.听起来优点违反直觉,当我们谈到重构, 人们很容易能够看出它能提升质量,

4、改善设计,提升可读性,减少错误,这 都能提升质量,但这难道不会降低开发速度吗?我绝对相信:良好的设计使快速开发的根本,事实上,有良好的设计, 才可能做到快速开发,如果没有良好的设计,或许某一段时间你得进展迅速, 但恶略的设计很快就会使你慢下来.你会把时间花在调试上面,无法添加新 功能,修改时间越来越长,由于你必须花越来越多的时间理解系统,寻找重 复代码.真是一个恶性循环.三、何时重构几乎在任何情况下,我都反对专门拨出时间进行重构,重构应该随时随 地进行,你不应该为重构而重构,你之所以重构,是由于你想做别的事情, 而重构能帮你做的更好,下边来看重构的三次法那么.三次法那么:第一次做某件事时,只管

5、去做,第二次做类似的事情,你会 产生反感,但无论如何还是可以去做,第三次再做类似的事情,你就应该重 构.简言之,事不过三,三那么重构.1、添加功能时重构:最常见的重构时机就是在添加新特性时,你会问 问自己,是否能对这段代码进行重构,使你更快的理解它,如果在前进的过 程中,能够把代码的结构理清,这就不失为一个好时机;重构的另一个原动 力是代码的设计无法帮助我轻松的添加我所需要的特性,我看着设计,然后 对自己说,如果这样这样设计,添加特性就会简单许多,这种情况下,你就 可以拿起重构这把工具了.2、修补错误时重构:调试过程中运用重构,多半是为了让代码更具可 读性,当我看着代码并努力理解它的时候,我用

6、重构加深我的理解.3、代码复审时重构:好多公司都会做代码复审,由于这种活动可以改 善开发状况,重构可以帮助我复审别人的代码,重构还可以帮助代码复审工 作得到更具体的结果.过去的经验告诉我:1:难以阅读的程序,难以修改.2:逻辑重复的程序,难以修改.3:添加新行为时需要修改已有代码的程序,难以修改.4:带复杂条件逻辑的程序难以修改.因此,我们希望程序 1、容易阅读.2、所有逻辑都在唯一地点指定.3、新的改动不会危及现有行为.4、尽可能简单的表达条件逻辑.四、该怎么跟经理说重构的事儿如果这位经理懂技术,那么向他介绍重构,应该不会很困难,如果这位 经理只对质量感兴趣,那么问题就集中到了质量上边,在复

7、审过程中使用重 构就是一个不错的方法.当然很多经理嘴巴上说是质量驱动,其实更多是进度驱动,这种情况下, 我会给他们一个比拟有争议的建议:不要告诉经理.这是在搞破坏吗?我不这样想,软件开发者都是专业人士.我们的工作 就是尽可能快速创造出高效软件.我的经验告诉我,对于快速创造软件,重 构可带来巨大帮助.如果需要添加新功能,而原本设计又使我无法方便的修 改,我发现先重构再添加新功能会更快些.如果要修补错误,就得先理解软 件的工作方式,而我发现重构是理解软件的最快方式.受进度驱使的经理要 我尽可能快速完事儿,至于怎么完成,那就是我的事儿了.我认为最快的方 式就是重构,所以我就重构.五、重构的难题学习一

8、种大幅提升生产力的新技术时,你总是难以发觉其不适用的场合, 通常你在一个特定场景中学习它,这个场景往往是个工程,这种情况下你很 难看出什么会造成这种新技术成效不彰或形成危害.所以重构的同时,你应 该监控其过程,注意寻找重构引入的问题,随着对重构的了解日益增多,我 们将找出更多解决方法,并清楚知道哪些问题是真正难以解决的.六、何时不该重构有时候你根本不该重构,例如当你重新编写所有代码时,有时候既然代 码写的太混乱,重构它还不如重新写一个来的简单,作这种决定很困难,我 成认我也没有什么好准那么可以判断何时该放弃重构.重写的一个清楚讯号是现有代码根本不能正常运行,你可能只是试着做 点测试,然后就发现

9、代码中满是错误,根本无法稳定运行,记住,重构之前, 代码必须能够在大多数情况下正常运行.如何重构一、重复代码如果你在一个以上的地点看到相同的程序结构,那么可以肯定,设法把 它们合二为一,程序会变得更好.最单纯的就是同一个类的两个函数含有相同的表达式,这时你需要做的 的是提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码.另一种情况就是“两个互为兄弟的子类中含有相同的表达式,要防止 这种情况,只需要对两个类提炼出重复的代码然后推到父类中去.如果代码 只是类似,并非完全相同,那么就用提炼函数的方法把相似局部和差异局部 隔离开,构成单独函数,然后你可以运用模板方法的设计模式来实现其结构.

10、如果两个毫不相关的类出现重复代码,你应该考虑提炼一个新类,将重 复代码放到这个新类中去,然后在别的类里使用这个新类.二、过长函数拥有短函数的对象会活的比拟好,比拟长,不熟悉面向对象技术的人, 常常觉得对象程序中只有无穷无尽的委托,根本没有进行任何计算.和此类 程序共同生活数年之后,你才会知道这些小小函数有多大价值.间接层所能 带来的全部利益-解释水平,共享水平,选择水平,都是由小函数支持的.很早以前程序员就熟悉到,程序越长越难理解,所以应该积极的分解函 数,我们可以遵循这样一条准那么:每当我们觉得需要注释来说明点什么的时 候,我们就可以把需要说明的东西写到一个独立的函数中去,并以其用途命 名,

11、我们可以对一组甚至短短一行代码做这样的事情,哪怕函数替换后的调 用动作比函数自身还长,只要函数名称能解释其用途,我们也该毫不犹豫的 这麽做.百分之九十九的场合里,我们只需要把函数变小,然后提炼出新的函数 就行了,如果函数中含有大量的参数和临时变量,它们会对你的函数提炼形 成阻碍,如果我们把参数和临时变量当成参数,传递给新提炼出来的函数, 导致可读性几乎没有任何提升,这时我们要想方法消除这些临时元素,让过 长的参数列变得简洁一些.三、过大的类如果想用单个类做太多的事情,其内往往就会出现太多实例变量,一旦 如此,你得代码就需要重构了.你可以把几个彼此相关的变量一起提炼到一个新类中,和太多“实例变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论