相关阅读:

年初离职大潮汹涌:一个7年老员工的离职忠告

做为程序员,我到底在恐慌什么

互联网技术(java框架、分布式、集群)干货视频大全,不看后悔!(免费下载)

重构:从方法论到实践

最近部门内部组织了一次大型重构,刚好借着这个机会学习了重构相关的内容,重构可以说代码优化利器,可以很好改善代码结构和开发效率。个人觉得重构应该是随时进行的,开发阶段、测试阶段、上线后,任何时候你觉得代码写得不够好或者有bug都应该重构。

什么是重构

通俗讲就是不影响外界访问的前提下,修改代码的行为。这里的修改代码包括重新设计(业务设计和技术设计)和代码结构的调整。

重构是在不改变软件可观察行为的前提下改善其内部结构

重构通常不是一次性的,它贯穿软件的整个生命周期,只要觉得不合理都是重构的时机。

为什么重构

在接手一个遗留项目的时候,我们往往会遇到以下情况

某甲:代码看了半天还是看不懂啊,尼玛,一个方法上千行,心累ing

若干天后,终于看懂代码了,但是发现IDE一堆警告,一看提示说存在重复的代码,整个项目都是警告,那么多重复代码,不会封装一下吗,靠

试着优化下代码,改着改着发现好多if-else,还是多层嵌套,每个嵌套的判断还TM很复杂,想想还是先不改了,万一改出问题,老子要吃P的(线上故障)

以上情景想必大家一定很熟悉,心底肯定在嘀咕:这么烂的代码哪个孙子写的,不该了,老子重新写一套。。。

其实如果代码在最开始写的时候就考虑设计和扩展问题,并且迭代过程中不断重构,也不会出现上面的问题。这就显得重构在软件开发周期镭显得尤为重要,没有重构,腐败的代码就一直扩散,直到出事。

所以,总结下来,重构有以下好处:

让代码更容易理解

改善内部结构,修改更容易

提高编程速度,加快业务迭代

怎么重构

那么问题来了,怎么开始重构呢?说起来就三步:识别要重构的代码,使用特定手段修改代码,测试

先说第一个也是前提:如何识别代码的“坏味道”:在《重构》一书中提到了很多方面去识别腐败的代码,结合《代码整洁之道》我总结了下,主要有以下方面:

重复代码

解决重复的常用手法有:抽取到单独的函数、放在基类中、使用模板函数模式

模板函数模式是指有一些子类,其中某些函数以相同的顺序执行类似的操作,但各个操作的细节有所不同,不同的子类可以实现自己的操作

如果类存在继承关系,那么适合放在基类中,否则可以创建一个工具类,然后改成直接调用工具类

过长的类或函数

过长的类还是函数,通常意味着做的事情太多,是时候展现真正的技术了,这时候可以拆成多个小类或多个短函数。

拆分类

原则是:单一权责、内聚

常用手法:子类化,如果涉及外部接口的调用,可以抽象出一个接口。

拆分函数

原则是:短小、只做一件事、阅读良好

常用手法:以查询替代临时变量、引入解释性变量、分解临时变量、分解临时变量、移除对参数的赋值、以函数对象替代函数

命名随意

命名随意会导致后期修改理解费劲,徒增烦恼。命名记住一点:名副其实,不要取容易误导的名字

类名应当是名词或者名词短语

函数名应当是动词或者动词短语

无效注释

无效注释包括:废弃的代码、过多的信息、多余的注释。好注释包括以下几种:法律信息、关键代码处解释、警示、TODO、公共API的Javadoc

多个条件判断或switch

这个也很常见,如果遇到这种代码,可以使用多态进行修改,让每种特定类型的子类执行其特定逻辑

其他

在try-catch中用单独的函数封装行为,一段冗长的代码夹在try-catch定位代码没那么直接

一个类中的代码(外部函数调用除外)应该可以从上到下阅读下去,而不用在本类中跳来跳去

实践

在实际的重构中,肯定不是上来就开始修改代码,除非是很小的改动。否则一般需要先梳理既有业务的流程和详细规则,业务梳理后就需要梳理既有技术架构的流程了,梳理后就可以开始评估可以重构的地方,包括业务逻辑统一、技术流程优化、微服务化。

因为重构主要是技术内部的改动,所以梳理既有设计是很有必要的,评估出待修改的点后就可以开始重构了

重构后期还需要进行辅助设计,包括监控、性能优化(缓存、数据库)

扩展

以上内容是自己对重构的一些经验,希望能帮到准备或者已经在重构的小伙伴

可以参考我自己梳理一张脑图:

看完本文有收获?请转发分享给更多人


欢迎关注“互联网架构师”,这里是聚集了10W+技术的架构师圈子,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们聊互联网、聊架构,聊人生,聊职场,助你最快进阶!打造最有价值的架构师圈子和社区。

本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

  • 长按下方的二维码可以快速关注我们

  • 如想加群讨论学习,请点击右下角的“加群学习”菜单入群

重构:从方法论到实践相关推荐

  1. 阿里云官方出品:全面总结阿里云云原生架构方法论与实践经验

    本书亮点 阿里云官方出品,阿里云智能总裁.阿里巴巴首席技术官等推荐,全面总结阿里云云原生架构方法论与实践经验. 读者对象 开发人员:本书可帮助开发人员熟悉云原生架构的相关技术,使之能够从宏观架构的角度 ...

  2. 《架构设计2.0大型分布式系统架构方法论与实践》三高笔记

    目录 前言 高并发 高并发读 动静分离与CDN加速 缓存 并发读与Pipeline 重写轻读 读写分离 批量 高并发写 数据分片 任务分片 异步化 批量 高可靠 七板斧 高可用 高可用架构几个核心问题 ...

  3. 云原生数据中台:架构、方法论与实践

    前言 第一部分 数据中台与硅谷大数据平台 第1章 全面了解数据中台 1.1 数据中台概念的起源 3 1.1.1 艺电的"数据中台"改造 4 1.1.2 Twitter的数据驱动 6 ...

  4. 数据治理方法论和实践小百科全书

    什么是数据治理? 数据治理是指从使用零散数据变为使用统一数据.从具有很少或没有组织流程到企业范围内的综合数据管控.从数据混乱状况到数据井井有条的一个过程. 从范围来讲,数据治理涵盖了从前端业务系统.后 ...

  5. 对话式AI系列:中关村科金领域知识中台建设方法论与实践

    依托于对话式AI技术的智能对话系统,相对于传统的营销服系统(如呼叫中心.客服系统)而言,不仅仅是一款连接用户的沟通系统,更是一款拥有决策能力的.以自然语言进行人机对话交互的系统,具备实时交互能力.客户 ...

  6. 大数据培训 | 数据仓库构建方法论和实践

    数据仓库的价值 构思一个主题讨论数据仓库的构建方法论,包括数据仓库的价值.选型.构建思路,随着数据规模膨胀和业务复杂度的提升,大型企业需要构建企业级的数据仓库(数据湖)来快速支撑业务的数据化需求,与传 ...

  7. 实战工作十年的Code Review方法论与实践总结

    作为卓越工程文化的一部分,Code Review其实一直在进行中,只是各团队根据自身情况张驰有度,松紧可能也不一,这里简单梳理一下CR的方法和团队实践. 一.为什么要CR 提前发现缺陷 在CodeRe ...

  8. 数据中台建设方法论-4 实践

    讲完基本一些理论内容,下面可以讲一下实践过程的一些经验,下面以实施实现过程中,讲一下实践过程中一些难点 业务调研 数据中台并非一上来就咔咔咔按照理论开始搭建,这样十有八九后面要么返工要么做不下去.数据 ...

  9. 神策数据王灼洲:方法论 + 实践,全面解析数据采集方案,必看!

    数据采集是数据应用的源头,指导企业在产品.运营和业务等多方面决策.本文作者王灼洲从数据采集需求出发,详细解读了如何实现高效.可用的数据采集方案.主要内容如下: 数据采集的定义和重要性 业内常见的数据采 ...

  10. 从Vue重构到React的微应用实践总结

    前言 大家好,我是海怪.最近换到了新部门,在做智能平台相关的内容.我接到的第一个任务就是把以前前端的项目重构一次. 说是重构,不如说是重写一遍.因为原来的项目是 ant-design-vue + vu ...

最新文章

  1. linux下文件夹函数,如何从linux上的文件夹中找到一个函数
  2. install tabix/bgzip
  3. 【转】 Nginx深入详解之多进程网络模型
  4. 顺序表应用4:元素位置互换之逆置算法
  5. Robot Framework测试用例并行执行
  6. excel 宏编程_在 Excel 中使用 Python 开发宏脚本
  7. 算法- 分治算法(实现汉诺塔)
  8. android7.0提示定位,解决android7.0上某些PopuWindow显示位置不正确的问题
  9. R语言-merge和rbind
  10. mysql or 短路_MySQL是否使IF()函数短路?
  11. linux下编译C++文件基本命令
  12. 语音广播服务器,智慧校园语音广播说明(二)
  13. 三极管原理-导通条件
  14. 优色专显教你led显示屏诺瓦刷屏教程
  15. JavaWeb如何判断账户密码
  16. FIR 滤波器参数意义
  17. 关于华为产品生命周期
  18. 肉蛋堡记 - 符皓冉
  19. 初识顶点/片元着色器
  20. 《钻石王牌》:热血青春·棒球1号位

热门文章

  1. 1.4 PuTTY和Xshell远程连接与密钥认证登录
  2. C#中通过Lambda表达式为委托传入更多的参数
  3. windows,linux桌面系统管理
  4. WEB标准布局(DIV+CSS)学习笔记(二)--DIV的布局基础
  5. HashTable VS Dictionary
  6. POJ 1472 Instant Complexity
  7. 「代码随想录」213.打家劫舍II 【动态规划】力扣详解!
  8. alfred 4 (mac提升效率工具)
  9. Mac VLC播放器怎么禁止使用硬件解码?
  10. 用DbSchema生成表单和报表