重构三部曲:

1. 刀哥我打算重构这块代码

2. 来来竖三我跟你说说代码的坏味道

3. 刀哥咱俩探讨一下重构的手法

竖三看着这shit一般的代码,眉头紧锁,大口大口的呼气吸气,不断有轻叹声从口中传出。竖三心里暗骂:"shit,这TMD谁写的代码,完全看不懂,乱的跟乱麻一样"。不知过了多久,竖三实在忍无可忍,椅子往后一推,椅子顺势推出了一米多远,撞到墙上才停下了,竖三麻溜的站了起来,径直的走向刀哥的座位上。只见刀哥飞快的敲打着键盘。

竖三犹豫了一下,但还是打断了刀哥,说:"刀哥,有个事我想跟你说一下"。

"你说。" 刀哥放下手里的工作说。

竖三面带怒色,气不打一处来说:"我那个支付功能的代码看不懂,写的太乱了,我想把这块支付功能重构。你看行不行?"

刀哥推了推眼镜,看着这个孩子,仿佛看到了当年的自己。然后镇定地说:"嗯嗯,想法很好,但不是时候。"

"什么是时候呢?" 竖三紧追不舍的说。

"首先我们项目是在关键的交付期,截止时间是本周五下午,现在重构没办法保证功能。其次你要知道何谓重构,为何重构,还要知道重构的一些手法等等。" 刀哥不紧不慢地说。

竖三这一听心想意思是刀哥又要给我上课了,每次上课我都是云山雾绕,糊里糊涂,听了跟吃安眠药一样,不,比安眠药还管用。一回想我这不听,刀哥也不让我对代码动刀子呀,于是勉为其难的说:"刀哥,你简单跟我讲讲吧。"

"可以"刀哥说。

何谓重构

重构是对软件内部结构的一种调整,目的是在不改变软件外在行为的前提下,提高其可理解性,降低其修改的成本 。

这里有两层意思:

  1. 不改变软件外在的行为

  2. 改进代码的结构,提高代码的可读性,提高代码的扩展性,降低维护成本,这也是重构的原因

何时重构

  1. 添加新功能时,现有的代码无法轻松的添加新功能,我们通过重构方面地添加新功能

  2. 修复bug时,假如我们没法一眼看到bug的原因,或者说需要调试很久才能找到bug的根本,基本上说明代码不够清晰了,此时可以通过重构让代码更清晰。

  3. 在复审代码时。公司要求的审核代码的时间时,发现问题及时重构。如果公司没有要求代码审核,可以自己代码审核,比如每周固定时间,或者项目阶段性交付以后,通过复审自己的代码,发现不合理的地方,及时纠正。

何时不该重构

比起知道何时重构,何时不该重构同样重要。

  • 现有代码不能正常工作,大部分功能无法使用,说明我们可以废弃现有代码,另起炉灶了。

  • 项目接近Deadline不该重构,一旦重构可能会导致项目延期。这也说明一个问题,应该早点重构的。

重构的难题

数据库

  • 大多数商用程序都与它们背后的数据库耦合在一起,导致了数据结构难以修改。

  • 数据迁移,非常小心地将系统分层,将数据结构和对象模型间的一类降至最低,但数据库结构的改变还是会让人不得不迁移所有的数据。

修改接口

  • 对于未发布的接口 如果接口的调用者都在自己的控制下,修改接口不会造成影响

  • 已发布的接口 接口已经发布了,那么就需要维护新旧接口,保证调用者正常运行,对于旧接口可以通过新接口来实现。

所以注意不要过早发布接口

难以通过重构手法完成设计的改动

考虑候选设计方案时,想想将某个方案改为另一设计的难度有多大?如果看上去简短,就不必担心选择是否得当,就可以先简单实现。如果预先不到看不到重构方法,就需要在设计上投入更多力气。

总结

  • 何谓重构(what) :在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。

  • 为何重构(why):改进代码的结构,提高代码的可读性,提高代码的扩展性,降低维护成本。

  • 何时重构(when):添加新功能时,修复bug时,在复审代码时。

  • 何时不该重构:现有代码大部分功能不能正常工作,项目接近Deadline。

  • 重构的难点(Problem):数据库相关的代码改动,修改对外接口,框架设计相对难以改动。

竖三听后对重构有了一定的概念性的了解,但是呢,还是云山雾绕,说:"刀哥,我想消化一下。"

"OK,你先消化一下,一次不讲那么多了,免得你消化不良。改天我再跟你说说如何识别坏代码。" 刀哥说。

"OK。" 竖三说。

扫码关注公众号,查看更多内容。

刀哥我打算重构这块代码相关推荐

  1. 哥写的不是代码,是寂寞

    anytao.net | <你必须知道的.NET>网站 | Anytao技术博客  发布日期:2009.08.17 作者:Anytao © 2009 Anytao.com ,Anytao原 ...

  2. 开发好能重构的代码,都是这么干的

    摘要:绝大多数码农没日没夜被需求憋着肝出来的代码,无论有多么的吭哧瘪肚,都不可能有重构,只有重新写. 本文分享自华为云社区<还重构?就你那代码只能铲了重写!>,作者:小傅哥. 一.前言 我 ...

  3. 刀哥你咋地又回来了?

    我在A司干的不爽,回到了原来的公司,上班第一天与原来公司的同事殷勤的问候了一番.坐下来准备工作时,这时三愣子慢悠悠的走过来,走到我的面前,勾着我的肩,头凑到我面前,说:"刀哥,你咋地又回来了 ...

  4. 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  5. java 重构函数_包会,教你用Java函数式编程重构烂代码

    Java8 由Oracle在2014年发布,是继Java5之后最具革命性的版本. Java8吸收其他语言的精髓带来了函数式编程,lambda表达式,Stream流等一系列新特性,学会了这些新特性,可以 ...

  6. AIDE支持实时错误检查、代码重构、代码智能导航、生成APK

    AIDE是一个Android Java集成开发环境,可以在Android系统内进行Android软件和游戏的开发.它不仅仅是一个编辑器,而是支持编写-编译-调试运行整个周期,开发人员可以在Androi ...

  7. 避免代码冗余,使用接口和泛型重构Java代码

    转载自 避免代码冗余,使用接口和泛型重构Java代码 在使用动态语言和.NET工作了若干年后,我又回到老本行–Java开发.在Ruby中,清除代码冗余是非常方便的,而在Java中则需要结合接口和泛型实 ...

  8. 重构现有代码:Refactoring

    重构现有代码:Refactoring 1.WHY SHOULD WE REFACTOR? 1.Refactoring Improves the Design of Software Without r ...

  9. 重构-使代码更简洁优美:实际经验之谈(提供一技巧,让你省掉N多代码)

    这几天没怎么写文,因为在用 CYQ.Data  框架 重构以前的一个博客源码,而在重构的过程中,最关键的就是简化代码了. 今天,我将说一个很典型的示例,看完本示例后,不要惊讶,不要怀疑,它不是神马,也 ...

最新文章

  1. 正则表达式匹配分组(|、(ab)、\num、(?P<name>)(?P=name))
  2. c++ mysql 配置_C++--mysql相关配置
  3. Jquery.load() 使用
  4. 初始springCloud
  5. 找不到显示桌面的快捷方式怎么办|显示桌面的快捷方式找不到解决方法|显示桌面代码|...
  6. memcache单机版安装
  7. c#写图像tif gdal_Gdal系列 (二)读取图像基本操作b + 简单波段合成
  8. 梦幻飞屋创意房产海报,温馨画面,梦中的家园
  9. 逻辑回归python实现
  10. [神奇的问题啊,GetProcAddress一个不存在的API时,返回非空值,且指向另一个API]谜团解开,错不在GetProcAddress...
  11. mac 下 hadoop、spark 的安装及配置
  12. mysql enterprise backup 使用_mysql enterprise backup入门使用
  13. java多线程学习-java.util.concurrent详解(五) ScheduledThreadPoolExecutor
  14. 第一篇:CUDA 6.0 安装及配置( WIN7 64位 / 英伟达G卡 / VS2010 )
  15. 五大主流数据库深度对比!数据库开发、管理看这篇就够了
  16. 互联网寒冬中的跳槽指南
  17. 微型计算机的cpu分类,微处理器分类及组成
  18. 怎么将多张图片批量转为 Word 、Excel 、PPT 、PDF 等文档格式
  19. 全网最全最细的vmware虚拟机创建教程,一步一步教你完成虚拟机创建。
  20. 吐槽最新的chrome浏览器.

热门文章

  1. P1966 火柴排队题解
  2. python列表学习(2)
  3. 研发小伙伴Oracle快速运行一指禅
  4. 微信跳转外部浏览器 在微信中点击链接直接跳转到手机默认浏览器代码实现
  5. 支付系统设计三:渠道网关设计02-客户端报文解析
  6. 程序员是懒惰反复无常的伪知识分子,果真如此吗?
  7. java根号n元素的合并排序算法_分治算法:根号n段合并排序算法
  8. 艾司博讯:拼多多新店前期运营注意事项
  9. 二十四章:SEgmentation TRansformer (SETR)——以Transformer的序列到序列的视角重新思考语义分割问题
  10. 【海洋数值预报】海洋数值的简单认识