WHAT:什么是重构?

Martin Fowler:重构是一种对软件内部结构的改善,目的是在不改变软件的可见行为的情况下,使其更易理解,修改成本更低。

  • 大型重构

    • 对象:对系统、模块、代码结构、类与类之间的关系等的重构
    • 方法:有分层垂直拆分、模块化水平拆分、解耦、抽象UI组件、抽象业务组件、抽象区块
    • 方法论:编程范式、设计原则、设计模式
    • 影响:代码改动多,影响面广,难度较大,耗时较长,引入BUG风险高
  • 小型重构
    • 对象:对类、函数、变量等代码级别的重构
    • 方法:规范命名(见名知意)、规范注释、函数拆分、提取重复代码、eslint等
    • 方法论:统一代码风格、制定规范、语义化编程、eslint
    • 影响:影响面小,难度小,次数频繁,引入BUG风险低

WHY:为什么要重构?

  • 软件最初设计的时候没有考虑到全部的功能和细节
  • 软件需求变更和持续迭代导致原先的设计已不适用
  • 消除破窗效应,当代码里面有了坏味道而不及时改善,容易破罐子破摔加速恶化

HOW:如何重构代码?

  • 灵活运用编程范式思想

    • 面向对象
    • 面向过程
    • 函数式编程
  • 以设计原则为核心
    • SOLID
    • KISS
    • DRY
    • YAGNI
    • LOD
    • CRP
  • 以eslint为基础手段
    • airbnb
    • standard
    • recommanded
    • prettier
    • 自定义
  • 渐进式持续重构代码为方法论
  • 优点:持续集成、进度可控、过程可逆、不影响正常业务开发进度
  • 按金字塔原则对项目代码进行拆分
    • 业务模块水平拆分
    • 代码分层垂直拆分
  • 评估出每一个重构单元的耗时
    • 合理评估工作量
    • 权衡重构的性价比
    • 增加重构的可控性
  • 正在做或规划中的业务单元顺手完成重构,其他部分安排空闲时间依次重构
  • 注意
    • 从0->1一次性完成重构的理想场景只存在于理想中。如果真实存在,只能说明项目过小或者已经趋于稳定迭代很少,这种情况要考虑是否真的有重构的必要!!!
    • 不要有了锤子(重构方法论),就满世界去找钉子
    • 重构不是软件开发的必要流程,而是现有代码的组织缺陷或不合理的补救方式。
    • 养成好的代码风格code review的习惯避免代码的坏味道才是根本

WHEN:什么时候重构?

  • 不要等到积重难返有了瓶颈之后再进行重构,大规模高层次的重构耗时耗力难度剧大
  • 应该建立起渐进式持续重构的意识,发现当前业务代码写的有问题就应该及时进行小规模的重构,而不是欠一屁股技术债

BUG:重构会不会引入新的BUG?

会,所以怎么办呢?

  • 通过完整的单元测试保证重构前后的外部可见性一致
  • 有条件的话找专业的测试进行端到端测试灰度测试

RISK:重构上线带来BUG的风险怎么解决?

如果不通知业务方直接将重构的代码上线,一旦出现问题,你肯定全责并且重构没有功劳也没有苦劳了

  • 有条件的话找专业的测试进行端到端测试和灰度测试
  • 必须通知业务方并说服业务方同意,让业务方做好准备上线后检查一下。如果真的引入了bug也不太会追责,因为在预期内并且我们的目标也是为了项目的长远发展呀

FEASIBILITY:如何让业务方意识到现阶段重构是必要的并同意?

  • 让业务方、产品、测试看到开发中的痛点和技术上的瓶颈
  • 让所有人意识到缝缝补补破窗效应导致问题加剧,已经积重难返了
  • 强调重构带来的技术收益业务收益
  • 提供切实可行并可控的重构计划方案

PERFORMANCE:重构价值不被认可怎么办?

  • 明明是你代码写的烂才导致的重构,浪费时间,还有脸要绩效?想屁吃呢

    • 承认自己会写bug,表明没有不写bug的程序员(勇于担当并弱化责任,表明owner身份和地盘
    • 指出导致重构的其他原因:需求频繁变更,紧急需求倒排工时,没有将业务长期规划方向信息同步给开发,多人协作团队没有统一风格,团队没有code review,没有eslint规范等等(表明主要责任不在我,但是我意识到了问题主动解决了)
    • 强调重构带来的优点:BUG数量减少,维护成本下降,BUG排查变快,开发速度增高等(业务价值才是绩效的根本

(ps:本博客用于学习总结,欢迎友好交流)

代码重构,最佳实践,你真的会代码重构吗?相关推荐

  1. 前端代码标准最佳实践:javascript篇

    2019独角兽企业重金招聘Python工程师标准>>> 前言 最近一直重构项目的前端代码,也参考了各种前端代码的最佳实践,目的是让前端的HTML,CSS,Javacript代码更符合 ...

  2. 升级遗留代码的最佳实践

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 在传统企业甚至互联网企业中往往存在大量的遗留代码,这些遗留代码大多都能够正常工作,有的可能还运行着 ...

  3. 编写高性能Java代码的最佳实践

    编写高性能Java代码的最佳实践 摘要:本文首先介绍了负载测试.基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践.最后研究了JVM特定的调优技巧.数据库端的优化和架 ...

  4. 前端代码标准最佳实践:CSS篇

    上一篇<前端代码标准最佳实践:javascript>发表后,大家讨论还是很热烈,从侧面体现了前端工程师对写标准的前端代码的重视程度很高.这些最佳标准实践并不是那个权威组织发布的,而是由大量 ...

  5. 最佳实践系列:前端代码标准和最佳实践

    最佳实践系列:前端代码标准 @窝窝商城前端(刘轶/李晨/徐利/穆尚)翻译于2012年 版本0.55 @郑昀校对 isobar的这个前端代码标准和最佳实践文档,涵盖了Web应用开发的方方面面,我们翻译了 ...

  6. 前端代码标准最佳实践:HTML篇

    Web前端代码中,HTML是根本,CSS和JavaScript也是围绕着既有的HTML结构来构建,所以良好的HTML代码结构,除了提高了HTML代码的可读性,可维护性和执行性能之外,也可以让相对应的C ...

  7. Java Web应用的代码分层最佳实践

    转载自 Java Web应用的代码分层最佳实践 代码分层,对于任何一个Java Web开发来说应该都不陌生.一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,更加 ...

  8. 高性能Java代码的最佳实践

    高性能Java代码的最佳实践 前言 在这篇文章中,我们将讨论几个有助于提升Java应用程序性能的方法.我们首先将介绍如何定义可度量的性能指标,然后看看有哪些工具可以用来度量和监控应用程序性能,以及确定 ...

  9. Spotfire在文本区域添加自定义JavaScript代码的最佳实践

    这边文章包含了如何在TIBCO Spotfire分析文件的文本区域中以一种可支持和可维护的方式来开发自定义JavaScript代码的最佳实践和建议,因此,这些分析文件将持续与TIBCO Spotfir ...

  10. 【JS】982- 11个JavaScript代码重构最佳实践

    模式和重构之间有着一种与生俱来的关系.从某种角度来看,设计模式的目的就是为许多重构行为提供目标. 1.提炼函数 在JavaScript开发中,我们大部分时间都在与函数打交道,所以我们希望这些函数有着良 ...

最新文章

  1. Blender写实建筑场景制作学习教程 Exterior Visualization in Blender 2.9
  2. lsnrctl status无反应_膀胱癌新型基因疗法完全缓解率高达53.4%;根治性胃癌切除术时广泛腹腔灌洗无获益 | 肿瘤情报...
  3. Android 抓取app进程 hprof 文件
  4. python 数据逆时针旋转270度_Python自动耍俄罗斯方块
  5. SQL语言之DQL语言学习(二)条件查询
  6. python基础 ---- 使用pyCharm 调试
  7. js小案例:控制电灯开关
  8. 北京招聘 | 百度智能生活事业群组小度科技招聘对话系统算法实习生、工程师...
  9. LeetCode:Unique Binary Search Trees
  10. mysql 自增语句_Mysql 自动增加设定基值的语句 | 很文博客
  11. LeetCode 173. 二叉搜索树迭代器(中序遍历)
  12. 力扣-116. 填充每个节点的下一个右侧节点指针
  13. C++回调函数使用心得
  14. 怎么用计算机算国际象棋,一台会判断的计算机:自学72小时就能成国际象棋大师...
  15. 秒变“女装大佬”!Snapchat推出性别转换滤镜,离线实时渲染(附测评)
  16. EOS智能合约开发系列(五): 配置VS Code
  17. hmmbuild结果文件解读:hmm文件
  18. 2022浙江省计算机三级网络及安全技术考试自学资料(3)(更新于3.9)
  19. TIA博图——基本操作
  20. 他预言过Uber的成功、预言过川普的当选,但却预言不了这个!

热门文章

  1. 芝诺数解|「十二」二手房产,一手掌握——重庆二手房数据分析报告
  2. 中国便携式工作台行业现状动态与发展规模预测报告(2022-2027)
  3. 组合覆盖与PICT的使用
  4. 《网络安全入门到精通》- 3.1 - 数据库 - MySQL数据库
  5. JavaScript浏览器对象api整理
  6. Python关键字及含义
  7. 苹果系统地图定位服务器,iOS 系统地图实现及定位
  8. 分治法 第1关:求一组数据中最大的两个数
  9. pytorch学习(1) 数据集制作
  10. java求三角形周长 面积_Java代码计算三角形的周长和面积