如题,系统重构是一个什么玩意儿呢?大家可能有很多的不同看法:

1. 系统重构是那些系统架构师、技术大牛玩的高端玩意儿,跟咱普通屌丝不懂,跟咱没啥关系。

2. 系统重构就是改代码,大改特改那种,整个重来一遍,这个比较邪恶,比较容易改出事儿,还是不要轻易尝试。

3. 我知道系统重构,也知道它能改善遗留系统,但我还是不敢轻易尝试,因为改出问题来怎么办,还是算了吧。

然而我认为,现在我们对系统重构有太多的误解,以至于我们还不怎么了解它,就已经将它拒之门外。什么是系统重构呢?我认为,不同的人、不同的角色在看待这个问题时,答案是不一样 。

作为普通程序员,纯屌丝,重构不是一个阳春白雪的高级玩意儿,它是一种习惯,一种良好的编程习惯。这种习惯让我们迅速由菜鸟转变为大牛,可以编写出高质量、优秀的程序。怎么这样说呢?举几个例子吧。

假如你在实现某个功能的时候,发现与之前已经写好的某个功能相似或者相近,你应该怎么办呢?相信你下意识的动作是ctrl+C,然后是ctrl+V。复制一段代码是简单的,但你知道吗,这样做将给系统带来多大的隐患。它将使系统日后的维护变得困难,因为这段代码如果被复制了数遍,一旦日后需要变更,所有被复制的代码都必须要变更。散落一地的被复制代码将会使我们的系统日后越来越难于维护,而你千万不要成为造成这一切的恶人。

然而,实现代码复用并不容易,最关键是,原有的代码并不能立即为你的新程序所利用,因为它们往往是与其它代码耦合在一起。情况往往是这样,你发现既有的某段代码你可以利用,但这段代码是在某个类、某个函数中的一个部分,而这个类或函数的其它部分不是你需要的。这时候,如果你是一个优秀的编程人员,你应当运用重构中“两顶帽子”的设计模式设计:先不要添加新功能,而是重构原有代码,以适应新需求,然后在此基础上添加新功能。

具体怎么做呢?你可以有两个选择,抽取工具类与抽取父类:

抽取工具类。第一步,运用重构中的“抽取方法”,将你需要的代码抽取到另一个工具类中,形成一个公用方法,让原程序变为对该方法的引用;第二步,在你的新功能中引用该方法。

抽取父类。首先还是运用重构中的“抽取方法”,将你需要的代码抽取出来,放到一个新函数中,放在原有的类中。然后对该类抽取出父类来,将这个需要公用的新函数升级至父类中,这样“两顶帽子”的第一步完成;将你的新类设计成这个父类的子类,实现你需要的新功能。

除此之外,你还可以有其它的选择。代码复用考验的是开发人员面对问题的分析能力、面向对象设计的理解力、驾驭程序代码的设计能力。然而,不论你是屌丝还是大牛,学会运用“两顶帽子”将是你设计优质代码的最好捷径。

再假如,你现在拿到一个新需求,是在原有功能的基础上实现的功能扩展,你应当怎样做呢?下意识地,你拿着原有代码就开始改了,是不是?把原有代码用if语句框起来,然后将这些代码copy到if语句的另一端,然后开始改。我们常常骂别人代码写得烂,不要把编写很烂代码的责任都推给别人,其实自己也是烂代码的作者。正是我们对不正确编码的懵懂无知,不良习惯的听之任之,才使我们的系统越维护越烂,最后落到谁见谁头大的地步。

如果你是一个优秀的程序猿,你应当怎样做呢?好的代码设计,在添加新的功能时应当符合“开发-封闭原则(OCP)”。开发-封闭原则是这样描述的:我们开发的软件系统,对于功能扩展是开放的(Open forextension)[1]。这就意味着,当系统需求发生变更时,我们可以对软件功能进行扩展,使其满足新的需求。同时,我们对软件代码的修改应当是封闭的(Close for modification)。这意味着我们在修改软件的同时,不会影响到系统原有的功能。毫无疑问,这里的重点在于后一句话。

软件总是在功能扩展,这是不争的事实。然而需要满足封闭原则,即我们在添加新功能的同时不能修改既有代码,这怎么可能呢?怎么可能在添加新功能的时候不修改既有代码呢?许多人在看到这一点时就晕菜了。然而它是可能的,当我们做出合理设计时。是的,当我们做出合理设计时,准确地说是适时地设计出可扩展点时,我们就可以做到只添加新代码而不修改既有代码。但是,能实现OCP原则的前提是我们已经做出了可扩展设计,因此我们开始走向另一个极端,我们开始不节制地进行可扩展设计,即使这些可扩展点从来没有被扩展,因而形成过度设计。

过度设计使我们坠入了另一个轮回:期望的变更没有发生,而不期望的变更却发生了。期望的变更没有发生,使毫无价值的设计白白耗费我们的资源;不期望的变更却发生却使我们悴不及防,最终陷入绝望的境地。

运用重构方法解决了我们的问题,改变了我们的设计思路。我们不再需要为不确定的未来而埋单,我们只需要活在当下。我们不再需要做那么多的设计,我们只需要做现在需要的设计,让我们的设计尽量简单。那么当日后需求变更真正到来时怎么办呢?不要惊慌,当需求变更真正到来时,运用重构方法,重构原有的代码,设计出可扩展点,然后再按照OCP原则添加新的功能。重构原有的代码时,我们改变了我们的代码,但我们系统原有的功能没有变,因此我们可以有效地测试原有功能。然后添加新功能,因为有了可扩展点的设计,我们能符合OCP的设计,保证我们的设计质量,问题得到解决。

然而,也许你还是一头雾水,不知道具体该怎么做?没关系,饭要一口一口吃,路要一步一步走,至少我们开始明白,写出好的代码不容易,需要我们去学习,而系统重构就是实现这一目标的捷径。(续)


[1] 引自《敏捷软件开发:原理、模式与实践》

相关文章:

遗留系统:IT攻城狮永远的痛

需求变更是罪恶之源吗?

系统重构是个什么玩意儿

我们应当改变我们的设计习惯

小步快跑是这样玩的(上)

小步快跑是这样玩的(下)

代码复用应该这样做(1)

代码复用应该这样做(2)

代码复用应该这样做(3)

做好代码复用不简单

特别说明:希望网友们在转载本文时,应当注明作者或出处,以示对作者的尊重,谢谢!

系统重构是个什么玩意儿相关推荐

  1. python cs开发框架_我的第一个python web开发框架(24)——系统重构与ORM

    小白弄完代码版本管理和接口文档后,兴奋的找到老菜. 小白:老大,我已经按你讲的要求,将代码版本管理和接口文档都搞好了.从项目开始到现在,除了代码编写,感觉学会好多东西啊. 老菜:嗯嗯,实战确实需要掌握 ...

  2. 银行祖传系统重构实例:创立12年,只支持Python 2,跑着500多个应用程序

    作者 | THEHFTGUY.万佳 提到遗留系统,你会想到什么? 还在使用 Java 5 的路过 JDK 1.6 的我不说啥了 很多坑 难维护 从零开始(重写) 盼着 IE 什么时候不再能使用 ... ...

  3. 系统重构的10点经验总结

    导读:我们日常工作中,系统重构应该是最让人头疼的了,无论是错综复杂还是简单的系统,在发展的过程中都会经历重构,系统重构也是任何技术团队无法回避的问题,在我服务的多家公司,几乎每家公司都经历了一次甚至多 ...

  4. 机房收费系统重构(五)—登陆窗口完整版

         在上上篇.<机房收费系统重构(3)>.中主要是介绍了自己关于DAL层,工厂层.以及接口层,还有实体层的理解.可是好多读者再问我.你的代码呢,我在这解释一下.就是我仅仅是写出关于那 ...

  5. java如何无感知部署_干货!如何平稳用户无感知的完成系统重构升级

    前言 我们在实际开发系统的过程当中,很有可能会遇到需要进行系统重构升级的情况,需要重构的原因可能是之前的设计不合理,导致现在维护起来非常的困难,也有可能是现在的业务发展非常迅速,需要进行分库分表了又或 ...

  6. 系统重构数据同步利器之Canal实战篇

    一.背景 二话不说,先上图 上图来自于官网(https://github.com/alibaba/canal),基本上涵盖了目前生产环境使用场景了,众所周知,Canal做数据同步已经是行业内标杆了.我 ...

  7. 系统重构的未来:重构工具 Coca 一周年

    一年前,在公司大佬的指点之下,我开始写系统级重构工具 Coca (https://github.com/phodal/coca) .哦,不,不对,是刚开始学习 Golang,因为我的第一次提交是从一个 ...

  8. 【复杂网络】关于复杂网络中的动力学系统重构的文献资料整理

    关于复杂网络动力学系统重构的文献资料转载 问题描述 方法 1. 通用方法 1. 相关性方法 2. 基于信息论的方法 3. 格兰杰因果检验(Granger Causality)方法 4. 相空间重构方法 ...

  9. 直播助力杭州电商独角兽冲击上市,分账系统重构电商交易新格局

    从2016年传统电商开始探索"直播+电商"新模式,到短视频平台的弯道超车,五年内直播电商实现了从零到2万亿GMV的突破.从占比上看,2021年,全国网上零售额达13.1万亿元,直播 ...

最新文章

  1. 使用Chrome浏览器和FF浏览器查看ajax发送以及从服务器传回的数据
  2. 6.Spring Cloud Alibaba教程:Sentinel流量防卫兵的介绍与基本使用
  3. firewall-cmd命令管理防火墙
  4. Ehcache学习一:JDBC caching
  5. html清除图片缓存
  6. Mysql中行转列和列转行
  7. java web开发基础学习
  8. C语言第一个字节地址,C语言字节对齐详解
  9. 【Kafka】Kafka WARN Property ssl.keystore.location is not valid (kafka.utils.VerifiableProperties)
  10. Python自定义词云图形状和文本颜色
  11. 水利知识库AI助手+公务员资料【产品经理】
  12. anaconda出现Multiple Errors Encountered.
  13. php中访问控制_php访问控制
  14. 如何体面的解决浏览器首页被hao123绑架
  15. ckplayer6.8 php播放,CKplayer-超酷网页视频播放器 v6.8
  16. des加密+base64编码,base64解码+des解密
  17. 由于超过32位java限制_Java 32位Xmx vs java 64位Xmx
  18. 从数据架构看生鲜电商的数据价值
  19. CISC(复杂指令集)与RISC(精简指令集)的区别
  20. Lesson 11:聚类分析

热门文章

  1. 哪些“星战”技术会变为现实
  2. 【公众号文章备份】你会喜欢慢下来的生活吗?
  3. 会计基础工作规范E卷
  4. oracle 11g RAC ASM磁盘被强制下线抢修一例
  5. 蓝魔i100pro刷linux,双系统新旗舰 蓝魔i100 Pro首发评测
  6. oracle solaris翻译,opensolaris是什么意思
  7. 双层神经网络实现非线性回归——机器学习
  8. js进行i18n国际化配置
  9. Delta机器人运动学算法编译中遇到的问题
  10. 需求管理工具_DOORS和Reqtify — 需求管理和需求追溯工具