数月前,我曾经写过一篇博文《在代码重构中蜕变》,文中提到了我对重构的一些认识,今天再谈重构,缘起于近期针对重构进行了6次技术分享,每次对应《重构——改善既有代码的设计》一书中的一章内容,在此过程中与团队一起再学习了一次重构,因此,这次再谈重构,就从学习的角度说起。

当再次拿起这本书时,想到的就是第一次阅读时的体会。几年前,第一次打开书,读完了第六章——重新组织你的函数,知道了大体上重构是怎么回事,如何完成,然后就再也读不下去了。当时心里想,虽然书里列出了若干条重构手法,但看上去好像千篇一律了,像提炼函数、将函数内联、将临时变量内联……实在是太简单了,只要我想改,随手就把代码改了,还要这些手法干嘛呢?这就是我当时的实际想法,由此,我就学完了重构,书也束之高阁了。

再学重构时,我认识到了很多当时的局限。

首先,重构手法只是便于表达和记录,不是要死记硬背的东西,更不是放之四海而皆准的数理化公式定理。我们要学的不是每一条手法的名称、动机、作法,而是要深刻领会每一条手法背后所适用的场合。我们可以一个名称都记不住,但我们要形成用这种思路提升代码可读性的认识。

其次,重构本身是一种理念。学习重构,就是要学习从能识别出代码中的坏味道,到能消除代码中的坏味道的思维过程,就是要形成这样的意识,并且能在实际工作当中加以实践运用,就是要想方设法的让代码清爽。一些必要的手法可以开拓我们改进代码的思路,但并不是只有这种方法才行。

再次,重构还是一种决策过程。程序是平衡的,不仅架构师在面对各种决策,所有工程师其实都要面对,要在各种约束中做出选择。重构也是如此,我们看到很多的重构手法是互相矛盾的,比如‘将单向关联改为双向’对应的就是‘将双向关联改为单向’,比如‘提炼子类’与‘提炼超类’等等,具体用哪种更合适,那是需要我们在实际情况中去决策的。

最后,重构从更广泛的意义上来讲,里面除了有修改代码的方法以外,更包含了编程标准或规范,以及程序设计思维。里面的很多手法就是设计模式,所以学习重构,就不能只把它当成一个修改代码的手段来学了。

很显然,重构对于提高代码质量,提高编码能力是非常重要的,那么怎样才能快速的掌握这一工程师必备技能呢?一句话,在明白重构本质的前提下去实践。

看书无疑还是枯燥的,只有把它转化成实际应用,才能加深认识。如果手中有实际的代码,不妨从自己能把握的小范围开始,重命名、提炼、内联、搬移……看看改完了是否让别人能更容易理解。如果手中没有实际代码,可喜的是书中的范例很不错,要在IDE中尝试着来做一下。但要注意三点:一是要频繁测试,尤其是产品代码,一定不能改变现有的功能,不能引入新的bug;二是只在自己能控制的范围内修改,不要修改其他人的代码甚至整体结构,慎重;三是书中的代码是示意性的,很多是编译通不过的,要自己亲自动手才能领会其中的细节。

我想,对重构有了正确的认识,再加上勤于实践,把思路着重于重构手法的应用场景而不是作法细节甚至对手法名称的背诵,就一定能够用最短的时间掌握这种技能了。

——欢迎转载,请注明出处 http://blog.csdn.net/caowenbin ——

再谈对“重构”的学习相关推荐

  1. 一个菜鸟程序猿--再谈六月坚持英语学习

    有时候想想,这人生就是一个又一个车站,走到一个网站,累了,歇一歇.明天还得继续出发,而一路上,也会遇到不同的人来陪我们一起走,大家或陌生,或熟悉,总会给我们孤独的心里一种温暖的陪伴. 一个人的路,走的 ...

  2. 再谈计算机编程的学习

    很久没有写笔记了,有几次想写点什么,可是提起笔来,又不知该给谁写,写点什么,大本营里的人越来越多,加我好友的越来越多,可是真正研究过我笔记的却没有几个,来这里的朋友大多数还是想学点东西,或是对软件开发 ...

  3. 一个菜鸟程序员--再谈六月坚持英语学习

    有时候想想,这人生就是一个又一个车站,走到一个站点,累了,歇一歇,明天还得继续出发,而一路上,也会遇到不同的人来陪我们一起走,大家或陌生,或熟悉,总会给我们孤独的心里一种温暖的陪伴.一个人的路,走的再 ...

  4. tensorflow和python先学哪个-前辈说先学会了这些Python知识点,再谈学习人工智能!...

    原标题:前辈说先学会了这些Python知识点,再谈学习人工智能! 首先我们看一看Python的优势: 开源,跨平台. 社区.不要小看这一点.社区意味着有很多教程.书籍,出了问题很容易google到,乃 ...

  5. 网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解

    目录 前文链接(系列助学, 也为后文学习做铺垫, 可按需读取) 一. 再谈HTTP再理解 二. HTTP对比学习HTTPS HTTP和HTTPS的区别如下: 三.TCP协议  (三次握手四次挥手细节过 ...

  6. 再谈深度学习文本的表示

    阅读目录 深度模型如何学习和表示词.短语.句子和篇章呢? 几大前景方向: 作者:尹文鹏,德国慕尼黑大学博士研究生二年级,自然语言处理方向.先后在西北工业大学和北京大学获得本科,硕士学位. 小编:文本表 ...

  7. 再谈如何学习Linux,一线Linux专家学习经验谈

    →点击领取阿里云限量红包 记得最早接触linux是在2000年,那个时候,还在上大学,一个同学从荷兰回来,带回来了一个Linux的拷贝版,记得版本还是Redhat6.2.曾经为安装一个系统让我们忘记疲 ...

  8. JVM学习笔记之-垃圾回收相关概念 System.gc()的理解 内存溢出与内存泄漏 STW 垃圾回收的并行与并发 安全点与安全区域 再谈引用:强引用 软引用 弱引用 虚引用 终结器引用

    System.gc()的理解 在默认情况下,通过System.gc()或者Runtime. getRuntime ( ).gc ()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试 ...

  9. Martin Fowler谈《重构HTML:改善Web应用的设计》

    Martin Fowler 谈<重构HTML :改善Web 应用的设计> 仅仅十余年, Web 就从一门大有希望的技术演变成了世界基础设施的重要组成部分.在这个绚丽迷人的年代中,涌现了许多 ...

最新文章

  1. VMware vCenter Converter Standlone迁移手册
  2. keepalived热备 keepalived+LVS Haproxy
  3. 商品和服务税收分类编码表_如何设置客户编码和商品编码?(附操作图)
  4. Yii的hasOne hasMany
  5. 字节序及字节排序函数
  6. 大部分人不知道的 5 个强大HTML5 API
  7. 记一次详细的的SQL查询经历,group by慢查询优化
  8. Android播放外部音乐文件
  9. Linux sudo一些命令出现 command not found 的原因
  10. 易筋SpringBoot 2.1 | 第廿一篇:SpringBoot的Mybatis生成工具Generator
  11. iOS 录音,播放并上传
  12. DHCP报文分析(三级网络技术)
  13. Java枚举类配合Switch
  14. windows驱动 - IRQL
  15. CCproxy代理服务器
  16. 浏览器-错误 未能加载 PDF 文档
  17. Unity Shader-热空气扭曲效果
  18. node.js毕业设计安卓校园代办助手app(程序+APP+LW)
  19. 如何提高Windows 系统性能
  20. window系统换为ubuntu系统

热门文章

  1. php session header,php session header()重定向后丢失 - php
  2. 节假日api--java调用与获取数据
  3. 树莓派——win10远程登录以及蓝屏问题(转载)
  4. JavaSE:抽象(abstract)
  5. hasNext ()和 hasNextLine()区别
  6. mybatis动态sql模糊查询方法
  7. 基恩士KV7500,KV8000轴控制FB模板,直接可以拿来用,使基恩士编程也随心所欲
  8. 全志平台Android4.0 SOFTAP STATION共存调试记录1
  9. PLC、运动控制卡、运动控制器,傻傻分不清
  10. 信号时域频域特征公式