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?
会,因此怎么办呢?web
- 经过完整的
单元测试
保证重构先后的外部可见性一致
- 有条件的话找专业的测试进行
端到端测试
和灰度测试
RISK:重构上线带来BUG的风险怎么解决?
若是不通知业务方直接将重构的代码上线,一旦出现问题,你确定全责而且重构没有功劳也没有苦劳了编程
- 有条件的话找专业的测试进行端到端测试和灰度测试
- 必须通知业务方并说服业务方赞成,让业务方作好准备上线后检查一下。若是真的引入了bug也不太会追责,由于在预期内而且咱们的目标也是为了项目的长远发展呀
FEASIBILITY:如何让业务方意识到现阶段重构是必要的并赞成?
- 让业务方、产品、测试看到开发中的痛点和技术上的瓶颈
- 让全部人意识到缝缝补补破窗效应致使问题加重,已经积重难返了
- 强调重构带来的
技术收益
和业务收益
- 提供
切实可行并可控的重构计划方案
PERFORMANCE:重构价值不被承认怎么办?
- 明明是你代码写的烂才致使的重构,浪费时间,还有脸要绩效?想屁吃呢
- 认可本身会写bug,代表没有不写bug的程序员(敢于担当并弱化责任,代表
owner
身份和地盘
)
- 指出致使重构的其余缘由:需求频繁变动,紧急需求倒排工时,没有将业务长期规划方向信息同步给开发,多人协做团队没有统一风格,团队没有code review,没有eslint规范等等(代表主要责任不在我,可是我
意识到了问题
并主动
解决了)
- 强调重构带来的优势:BUG数量减小,维护成本降低,BUG排查变快,开发速度增高等(
业务价值才是绩效的根本
)
(ps:本博客用于学习总结,欢迎友好交流)设计模式