《代码重构》读书笔记(一)

一、简单认识重构

1.认识重构的概念

重构是一种非常重要的技术,越复杂的系统越是需要不停地进行不同规模上的重构;

什么时候我们需要重构:当我们打算修改系统或者添加优化需求时,结构较差的系统很难修改,因为很难找到一个合适的修改点和扩展点;比如,我们可能需要在很多处都进行一致性修改,我们可能有一个很复杂的函数以至于当我们扩展时就只能复制粘贴冲i性能创建一个函数来满足需求;所以,如果发现自己需要为程序添加一个特性,而代码结构是你无法方便地那么做,那就先重构这个程序,使特性地添加比较容易地进行,然后再添加特性

二、重构原则

1.何谓重构

对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本;其实就是不改变软件可观察行为的前提下调整代码结构

重构的目的就是为了让软件更容易被理解和修改,也就是指软件的扩展性和代码的可读性两个方面;

注意:在开发过程中使用重构技术,通常包括两种行为:添加新功能和重构;这两种行为是不能并行的,需要分别执行;添加新功能时就不要去重构,如果感觉不方便添加,那就先重构,完成后再去添加新功能;也许我们可能要为两种行为不停切换时间片,但同一时间只有一个行为

2.为何重构

软件工程没有银弹,所以重构也不是完全之策,它是一个工具,我们对它的使用也需要基于一些因素做好权衡取舍;

重构改进软件设计:重构就是在整理代码,尽可能将所有的东西变得更有条理;同时,代码结构的流失是累积性的,极易陷入恶性循环中,经常性地重构就是为了保持代码的合理结构;其中最重要的一点就是,消除冗余代码,尽量保证所有的行为只表述一次,这便是优秀设计的根本所在,它能够大大降低维护成本,并带来诸多利好;

重构使软件更容易理解:第一点就是为了提高代码的可读性,使后来者或者后来的自己更好地理解代码;第二点就是使用重构技术来阅读自己不熟悉的代码;

重构帮助找到bug:通过对代码重构可以更好理解代码的意图,搞清楚程序结构;“我不是一个伟大的程序员,我只是一个有着一些优秀习惯的程序员”;

重构提高编程速度:重构可以帮助自己更快地开发程序;虽然谈到重构,往往会想到它在提高代码质量的同时需要增加时间成本,但是从长远来看,如果没有良好的代码设计,虽然前期速度很快,但是恶劣的设计很快就会让你慢下来,而且你之后会花大量的时间进行调试,无法添加新功能,修改时间愈来愈长,在维护时需要花更多的时间来维护系统、寻找重复的代码;所以,良好设计是维持软件开发速度的根本,重构可以帮助我们防止系统设计腐败变质

为什么重构有用:程序有两面价值,今天可以为你做什么&明天可以为你做什么;所以,我们不仅要关注系统当下的行为,还要想着如何去完成明天的工作;如果我们一直不重构,将会出现以下几个严重问题:

  • 难以阅读的程序,难以修改维护;
  • 逻辑重复的程序,难以修改维护;
  • 添加新行为时需要修改已有代码的程序,难以修改;
  • 带复杂条件逻辑的程序,难以修改维护;

所以,我们重构就是希望我们的程序:

  • 容易阅读,可读性好
  • 所有的逻辑都在唯一地点指定
  • 新的改动不会危及现有行为(也就是开闭原则,对修改关闭,对扩展开放)
  • 尽可能使条件逻辑简单化

3.何时重构

添加功能时重构:最常见的重构时机是想给软件添加新特性时,重构的直接原因往往是为了帮助自己理解需要修改的代码---可能是别人写的,也可能是自己写的;常常问自己:能不能通过对这段代码进行重构来使自己更快地理解它,如果可以就重构;原有代码的设计让自己无法轻松添加新特性,这时也需要重构,完成重构来使新特性的添加变得更快速、更流畅;

修补错误时重构:调试时运用重构,多是为了代码的可读性,然后更快地定位bug;虽然重构会多占用一些时间,但是要记住之前所提到的,从长远来看,重构的时间成本往往都是必要的;

复审代码时重构:很多公司都会有CodeReview,所以很多人会在这时去重构,但要明白CodeReview只是重构的一个小小的时机而已;

4.怎么对经理说

鉴于PM往往是“进度驱动”而不是“质量驱动”,所以不要告诉经理;

对于快速开发,重构可以带来巨大的帮助,对于修改错误,重构也是理解软件的最快方式;

间接层和重构:计算机科学是这样一门科学,它相信所有问题都可以通过增加一个中间层来解决;下面是间接层的一些价值:

  • 允许逻辑共享,比如一个子函数可以被多个其它函数调用,修改子函数的逻辑就可以完成多地功能的改动;
  • 分开解释意图和实现:可以通过类和函数名来解释自己的意图,但是如果在类或函数内部又要以更小单元的意图来编写,就需要通过间接层来实现多一层封装;
  • 隔离变化,这一点的好处也是由之前允许逻辑共享带来的;

5.重构的难题

我们知道重构的好处,但是我们也需要看到一些关于重构的局限性;

修改接口:在一个对象中,它们允许你分开修改软件模块的实现和接口,修改对象内部实现通常是比较安全的,但是对于接口的修改需要十分谨慎;而重构有时会带来问题:我们确实需要修改接口,但是如果这个接口是已发布的(这种情况下我们不可能修改所有调用者的接口),然后我们的问题就转换为,如何去面对那些必须修改的“已发布接口”;大多数软件开发者采取的措施都是:同时维护新旧两个接口,尤其在各种软件迭代时,我们经常会看到开发者会在发布新接口时暂时同时维护两个接口,并将旧接口标记为obsolete,然后慢慢迭代掉;这里需要注意的一个点是:让旧函数接口调用新函数接口,也就是新接口是向前兼容的,而不是复制函数实现(也就是不要有重复的代码)

难以通过重构手法完成的设计改动:有一些设计错误尤其是某些核心设计决策,可能会是很难通过重构来解决的,往往重写会是更容易的;

何时不改重构:重写比重构更简单时:当代码过于混乱时,或者现有代码根本无法正常运作或稳定运作时;

折中的办法:将“大块头软件”重构为封装良好的小型组件,然后逐一对组件做出重构或重写的决定;

6.重构与设计

重构肩负一项特殊使命:它和设计彼此互补;初学编程,往往会急于编码,但是很快就会出现代码结构过于混乱的问题,而事先做好设计可以让自己节省返工的高昂成本;要明白:重构并不能取代预先设计,也没有完美的设计可以让后期不需要重构,两者是一种互补关系的相互存在;

在开发开始之前,我们需要做一个预先设计,但是这个预先合计只需要是一个足够合理的解决方案就可以,随着开发过程,对软件和需求的理解加深,就可以使用重构手法适当调整;过于追求预先设计的完美性很可能会导致劳而无获;

7.重构与性能

关于重构,有一个常被提出的问题:它对程序的性能将造成怎样的影响,为了让软件易于理解,可能会做出一些使程序运行变慢的修改;但是要注意到,虽然重构可能使软件运行变慢,但它也使软件的性能优化更容易;

关于性能一件很有趣的事情是:如果对大多数程序进行分析,会发现 ,程序的大部分时间都耗费在很小一部分代码中,如果你一视同仁优化所有代码,那么90%的优化都是白费力气,因为那些代码很少被执行;所以做优化时,需要对程序有清楚的认识,从而针对性优化某一部分;

如何进行有效的性能优化:首先应该有一个度量工具来监控程序的运行,比如各种性能分析工具,我们需要从工具中得知那些地方大量消耗时间和空间,然后关注这些性能热点,并做出持续优化;

一个构造良好的程序可从两方面帮助优化

  • 构造良好的程序可以让你有比较充裕的时间进行性能调整,因为构造良好,你就能更快地添加功能,也就有更多时间用在性能问题上;
  • 构造良好的程序可以让你在性能分析时拥有较细的粒度,然后就可以进入到一个范围较小的程序块中,从而使性能的调整更加容易;

本篇笔记就先到这里吧。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值