重构-改善既有代码的设计解读

第一章 - 回答重构的节奏是怎样的

重构的第一个例子

  1. 提炼函数:只读变量作为函数入参,读写变量考虑作为函数出参;函数返回尽量叫result;
  2. 重构第一步一般是移除局部变量:手法有以查询代替取代临时变量和内联变量的方法。
    两种方法的关系:都是为了消除一个一次赋值后不再修改的函数内临时变量,以查询代替临时变量是指把求得临时变量的过程包装成一个函数。内联变量是指用赋值表达式(这个赋值表达式当然可以是以查询替代临时变量的函数)
  3. 第一章这个例子的整体过程就是(1)先消除局部变量,形成很多很小的函数 (2)把这些很小的函数分为两个阶段(计算阶段和输出阶段),拆分成两个类 (3)对于switch case部分的代码,用多态来替换

整体节奏:通过消除局部变量,一小步一小步地进行重构,没完成一小步就运行测试,最后可以聚沙成塔(记住,真正的重构应该是在任何时候都可以停下来而不影响功能使用的)

第二章 - 为什么要重构

都知道是为了让别人看得自己的代码,让代码更容易被修改和扩展,总的原则是重复或类似的事情看到三次就应该考虑重构了,这章个人觉得快速了解一下即可。

第三章 - 何时重构(代码的坏味道)

  1. 难以理解的命名
  2. 重复的代码
  3. 过长的函数
    什么时候用?(1)代码前需要注释才说得清楚时(哪怕只有一行代码也值得提炼出来,然后取得可以说明问题的名字) (2) 遇到 if \ for \ switch case 时可以考虑比如把循环和循环体内的代码都抽取出来
  4. 过长的参数列表:一个函数最多不超过三个参数
  5. 全局数据及可变数据
  6. 发散式变化:引入一个新功能的时候需要修改两个上下文 (这个书里也没讲太明白)
  7. 霰弹式修改:遇到一个变化需要在很多不同类中做不同的小修改
  8. 依恋情结:一个函数要调用到其它对象中的很多数据,这时候应该把这个函数放到该类中
  9. 数据泥团:两个类中相同的字段、许多函数中相同的参数,这些可以绑定在另外一个类中
  10. 基本数据类型偏执:该创造属于自己的数据类型时就去创造,不要偏执于使用基本数据类型,比如代表钱应该创造一个money类而不应该用整数或double去表示,表示坐标也该创造一个point类,不要过度使用String
  11. switch语句/if语句:用多态来取代
  12. 循环语句 :用函数式编程方法取代
  13. 冗余函数:有些类只有简单的函数,有些函数名字跟实现代码看起来一样,此时就可以把这个外层包装去掉了
  14. 过分强调通用性,留下太多钩子
  15. 临时字段:某个类有些字段只为了某些特定的场景设定,此时应该把这些字段抽到专门的一个类去统一管理
  16. 过长消息链 和中间人: a要调用b, b调用c , c调用d,a才能拿到d的东西,这个消息链就是过长的。中间人就是一个类的接口有一半的函数就是委托给其它类来调用自己的。那此时可以考虑去掉这些中间环节
  17. 过大的类:单个类做的事太多,字段太多
  18. 纯数据类中所有字段都给了getter和setter :类中不可修改的字段无须封装、不要有getter和setter
  19. 子类不去实现父类的接口:这时候这种类不应该是父类的一个子类,应该用委托的方法或把他不需要的接口从父类下沉到他的兄弟类中

第四章 - 写好重构的保障(如何写测试)

  1. 测试的基本结构:准备数据 - 执行 - 断言(assert) -(清楚共享数据)
  2. 测试要同时测试正例和边界条件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值