不得不说的大道理 - 代码重构的艺术(1)

❝ 劣质代码可能会影响后续优化的效率,从而进一步造成代码劣化;随着时间的推移,这种效应将会导致代码质量大幅下降。破窗效应 (The Broken Windows Theory) ❞

其次,优秀的代码或架构不是一开始就能完全设计好的,就像优秀的公司和产品也都是迭代出来的。我们无法100%遇见未来的需求,也没有足够的精力、时间、资源为遥远的未来买单,所以,随着系统的演进,重构代码也是不可避免的。

何时需要重构


第一次做某件事时只管去做;第二次做类似的事会产生反感,但无论如何还是可以去做;第三次再做类似的事,你就应该重构.

添加新功能时重构

「种一棵树最好的时间是十年前,其次是现在。」 重构的最佳时机就是在添加新的功能之前。再动手添加新功能之前,我们不妨先考虑一下,如果对现有的代码结构做些微调,是否会使加入新的功能变的容易的多。

❝ 如果你要给程序添加一个特性,但发现代码因缺乏良好的结构而不易于进行更改,那就先重构那个程序,使其比较容易添加该特性,然后再添加该特性 ❞

修改问题时重构

「扫去窗上的尘埃,才可以看到窗外的美景。」 修改一个问题时,我们需要先理解代码在做什么,然后才可以着手去修改。这段代码可能是别人写的,也可能时自己写的,但无论如何,当你觉得这段代码逻辑糟糕,需要花费几分钟才能明白其中的含义时,你就要想着如何去重构才可以使代码变的更加简洁直观

有计划的对代码重构

「找寻重构和开发进度中适合自己的平衡点」 但有些时候我们在准备重构的时会发现,之前的代码结构和依赖关系错综复杂,这时我们就要考虑当前是否有足够时间去很好的处理这些混乱的代码。尽管重构的目的是加快开发速度,但同时重构也会拖慢软件的开发进度。如果时间充足,那么当下就是进行重构最好的时机。当鱼和熊掌不可兼得的时候,应当保证软件的开发进度不受影响,其次才是进行重构。可以先把需要重构地方记录下来,整理出一个计划,在未来的一段时间内解决掉。

Code Review时重构

「处明者不见暗中一物,处暗者能见明中区事。」 Code Review有助于在开发团队中传播知识,也有助于让较有经验的开发者把知识传递给比较欠缺经验的人。Code Review对于编写清晰的代码也很重要,我写的代码也许对于我自己来说很清晰,但对于别人来说则不然。Code Review让更多人有机会提出有用的建议来对代码进行调整。三人行,则必有我师。

何时不应该重构

「有所为,有所不为。」 并非所有的糟糕代码都需要重构,如果你不需要使用到这段代码,那么就不必花心思去重构它。只有你需要理解其中的工作原理时,对其重构才有价值。当然如果重写比重构更容易,那么就不需要重构了。

如何保证重构后程序的正确性


保证代码正确性最好的方法就是进行「单元测试(Unit Testing)」 。当重构完成之后,如果新的代码仍然能通过单元测试,那就说明代码原有逻辑的正确性未被破坏,原有的外部可见行为未变。

测试驱动开发是非常完美的方案。但实际上大部分IT公司的程序由于种种原因并没有单元测试。这时需要一些工具用来帮助我们快速扫描代码中的问题。比如可以给代码增加Lint语法检查,使用SonarQube对代码进行质量和漏洞扫描,前端同学还可以使用TypeScript等等。把这些代码自动扫描工具集成到CI里面,可以大幅度 减少出现bug的情况。目前我所在部门前端组的一系列产品包括项目,已经把这些功能集成在CI里面的,每次的代码更新,都会触发扫描代码的流程,CI失败就无法将代码合并到开发分支上面。

有了上述这些还不够,在重构完成之后,还要把改动部分的功能完整的自测一遍,以保证程序无误。当自测通过之后,就可以请测试同学来帮忙进行更加完整的测试流程。

❝ 为什么要进行这么严格的测试流程,因为要保证程序可靠性。如果一件事有可能出错,那么它一定会出错。❞

需要重构的Bad Code


糟糕的命名

整洁代码最重要的一环 就是好的名字,所以我们要深思熟虑如何给函数、模块、变量和类命名,使它们 能清晰地表明自己的功能和用法。

无意义的注释

学会只编写够用的注释,过犹不及,应当重视质量而不是数量

多层的if语句嵌套

if-else在程序设计中是不可避免的,作为程序员能做的就是减少嵌套,提升代码的可阅读性和质量

很酷却不宜理解代码

上面这种写法看起来是不是很酷,但是过一段时间再来看,你还能一眼看出这部分功能是做什么的吗?在我刚接触后端,使用python的时候写过这样的代码,结果就是在排查问题的时候相当头疼。代码写的别人看不懂并不厉害,而是写的谁都看的懂才是厉害。

❝ 调试在一开始就比编写程序困难一倍。因此,按照定义,如果你的代码写得非常巧妙,那么你就没有足够的能力来调试它。柯林汉定律 (Kernighan’s Law) ❞

不必要的继承写法

继承虽然是面向对象的四大特性之一,使用继承可以解决代码复用的问题,但也有其缺点: 继承层次过深、过于复杂会影响到代码的可维护性。如果子类中有方法依赖于父类中的 方法或属性,那么当父类发生改变时,子类很可能会发生无法预知的错误。

而组合的方式是把类中所有的接口功能单独实现,然后使用这些单独的对象组合在一起,完成和目标类一致的功能。继承是用来表示类之间的 is-a 关系,而组合是一种 has-a 的关系。使用组合+接口+委托的方式可以代替大多数的继承场景。

重构代码的设计原则


开闭原则 (The Open/Closed Principle)

❝ 实体应开放扩展并关闭修改。❞

实体(可以是类、模块、函数等)应该能够使它们的行为易于扩展,但是它们的扩展行为不应该被修改。

里氏替换原则 (The Liskov Substitution Principle)

❝ 可以在不破坏系统的情况下,用子类型替换类型。❞

如果组件依赖于类型,那么它应该能够使用该类型的子类型,而不会导致系统失败或者必须知道该子类型的详细信息。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值