代码重构,最佳实践,你真的会代码重构吗?
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排查变快,开发速度增高等(
业务价值才是绩效的根本
)
- 承认自己会写bug,表明没有不写bug的程序员(勇于担当并弱化责任,表明
(ps:本博客用于学习总结,欢迎友好交流)
代码重构,最佳实践,你真的会代码重构吗?相关推荐
- 前端代码标准最佳实践:javascript篇
2019独角兽企业重金招聘Python工程师标准>>> 前言 最近一直重构项目的前端代码,也参考了各种前端代码的最佳实践,目的是让前端的HTML,CSS,Javacript代码更符合 ...
- 升级遗留代码的最佳实践
云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 在传统企业甚至互联网企业中往往存在大量的遗留代码,这些遗留代码大多都能够正常工作,有的可能还运行着 ...
- 编写高性能Java代码的最佳实践
编写高性能Java代码的最佳实践 摘要:本文首先介绍了负载测试.基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践.最后研究了JVM特定的调优技巧.数据库端的优化和架 ...
- 前端代码标准最佳实践:CSS篇
上一篇<前端代码标准最佳实践:javascript>发表后,大家讨论还是很热烈,从侧面体现了前端工程师对写标准的前端代码的重视程度很高.这些最佳标准实践并不是那个权威组织发布的,而是由大量 ...
- 最佳实践系列:前端代码标准和最佳实践
最佳实践系列:前端代码标准 @窝窝商城前端(刘轶/李晨/徐利/穆尚)翻译于2012年 版本0.55 @郑昀校对 isobar的这个前端代码标准和最佳实践文档,涵盖了Web应用开发的方方面面,我们翻译了 ...
- 前端代码标准最佳实践:HTML篇
Web前端代码中,HTML是根本,CSS和JavaScript也是围绕着既有的HTML结构来构建,所以良好的HTML代码结构,除了提高了HTML代码的可读性,可维护性和执行性能之外,也可以让相对应的C ...
- Java Web应用的代码分层最佳实践
转载自 Java Web应用的代码分层最佳实践 代码分层,对于任何一个Java Web开发来说应该都不陌生.一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,更加 ...
- 高性能Java代码的最佳实践
高性能Java代码的最佳实践 前言 在这篇文章中,我们将讨论几个有助于提升Java应用程序性能的方法.我们首先将介绍如何定义可度量的性能指标,然后看看有哪些工具可以用来度量和监控应用程序性能,以及确定 ...
- Spotfire在文本区域添加自定义JavaScript代码的最佳实践
这边文章包含了如何在TIBCO Spotfire分析文件的文本区域中以一种可支持和可维护的方式来开发自定义JavaScript代码的最佳实践和建议,因此,这些分析文件将持续与TIBCO Spotfir ...
- 【JS】982- 11个JavaScript代码重构最佳实践
模式和重构之间有着一种与生俱来的关系.从某种角度来看,设计模式的目的就是为许多重构行为提供目标. 1.提炼函数 在JavaScript开发中,我们大部分时间都在与函数打交道,所以我们希望这些函数有着良 ...
最新文章
- Blender写实建筑场景制作学习教程 Exterior Visualization in Blender 2.9
- lsnrctl status无反应_膀胱癌新型基因疗法完全缓解率高达53.4%;根治性胃癌切除术时广泛腹腔灌洗无获益 | 肿瘤情报...
- Android 抓取app进程 hprof 文件
- python 数据逆时针旋转270度_Python自动耍俄罗斯方块
- SQL语言之DQL语言学习(二)条件查询
- python基础 ---- 使用pyCharm 调试
- js小案例:控制电灯开关
- 北京招聘 | 百度智能生活事业群组小度科技招聘对话系统算法实习生、工程师...
- LeetCode:Unique Binary Search Trees
- mysql 自增语句_Mysql 自动增加设定基值的语句 | 很文博客
- LeetCode 173. 二叉搜索树迭代器(中序遍历)
- 力扣-116. 填充每个节点的下一个右侧节点指针
- C++回调函数使用心得
- 怎么用计算机算国际象棋,一台会判断的计算机:自学72小时就能成国际象棋大师...
- 秒变“女装大佬”!Snapchat推出性别转换滤镜,离线实时渲染(附测评)
- EOS智能合约开发系列(五): 配置VS Code
- hmmbuild结果文件解读:hmm文件
- 2022浙江省计算机三级网络及安全技术考试自学资料(3)(更新于3.9)
- TIA博图——基本操作
- 他预言过Uber的成功、预言过川普的当选,但却预言不了这个!