如何让源代码成为一种逻辑线索?

维护代码是程序员非常重要的日常工作之一,那么你是否曾遇见过以下问题?

  • 接手维护项目,却发现文档缺失、代码无注释,加上维护人离职,基本只能靠猜来梳理代码逻辑。

  • 代码风格过于抽象(命名过短、魔鬼数字、重名方法等),看不懂,也不敢轻易修改。

  • 运行代码出现故障时,不打日志,不抛异常,导致定位问题需要耗费很长时间。

  • 大段的if-else代码嵌套组合,调用逻辑复杂冗长,扩展性差,重构优化费时、费力。

发现没,造成这些问题的原因其实都是代码的可读性差没能很好地串联起代码内在的逻辑。可读性差的代码难以理解,这不仅会造成诸多误解和麻烦,还会导致项目交付效率变低。虽然代码可读性是一种主观的定义,但是它确实能保证研发人员快速准确地理解代码的真实含义。

那么,为了提高代码的可读性,我们该如何做呢?今天这一讲我们就一起来学习一个能帮助你快速提升代码可读性的原则:表达原则

一、为什么要提升源代码的可读性

提升源代码的可读性主要有以下四大好处。

第一,更易于维护。代码写好后,需要调试、运行与修复 Bug,设计文档、需求文档和口头交流只能表达部分业务逻辑的意图,而代码则能反映出编程实现业务逻辑时的全部真实意图。可读性高的代码,能让阅读者在阅读时快速理解编写者的意图,即便逻辑复杂,也能在修改时准确地分析和理解,大大节省维护和修改代码的时间。

第二,更易于重构。现在很多项目之所以难以重构,就是因为代码的可读性太差。当你无法理解一段代码时,你会跳过它,而整个系统都难以理解的话,你可能就会选择重写而不是重构,因为重构必然会修改原有代码,这会引入一定的风险,一旦因为重构而导致故障,那么维护的人就要担责。所以说,可读性的高低在某种程度上决定了你重构意愿的大小。

第三,更易于测试。代码在修改时需要反复调试,如果代码的可读性很差,那么很多时候都需要写一些额外的 Mock 或测试接口来对原有的代码进行测试,不仅浪费时间,还容易造成误读。可读性高的代码,参数与输出都更清晰,在测试时能更精准地找到对应逻辑和问题点。

第四,更易于应用设计模式。设计模式除了在设计之初被使用外,其实更多时候都是在代码重构过程中被使用。在工作中,你会发现有的代码虽然写了很多嵌套的if-else,但命名和注释都写得很好,逻辑也很易读,在重构时就能通过设计模式很好地去优化。而有的代码虽然看上去很简洁,但使用了很多高级技巧或缩写命名,理解起来非常费时、费力,对于维护人员来说,自然不愿意考虑使用设计模式。

总体来说,提升代码的可读性能够帮助我们更好地理解代码,只有理解了代码才能更好地维护代码,而本质上代码就是用来维护的——不断修改与发布;另外,还有一个重要的用处是,能帮助阅读代码的人快速找到代码的实现逻辑。

二、表达原则:凸显代码的内在逻辑

虽说编写文档能够表达软件开发意图,但事实上,你可能很讨厌写文档,这是因为大部分文档都与代码没有直接关系,并且随着代码的不断调试与修改,文档会变得越来越难以与最新的真实情况同步。

另外,你可能也没有太多时间阅读文档,需求上线、Bug 修复、多项目并发是现在程序员的日常现状。因为时间紧、任务重,你可能只能边改代码边学习,这时一份逻辑清晰的代码才是你真正需要的。

不过,很多时候你可能并不知道该怎么在代码中表达自己的意图,其实,有一个原则可以帮到你,那就是表达原则。

表达原则(Program Intently and Expressively,简称 PIE),起源于敏捷编程,是指编程时应该有清晰的编程意图,并通过代码明确地表达出来

简单来说,表达原则的核心思想就是:代码即文档。也就是说,写代码时要像写设计文档一样帮助阅读者理解你想要表达的意图,要从程序设计者的角度跳出来,站在使用者的角度来写代码。

可以换个角度想想,假如你是代码使用者,你希望看到什么样的代码?很明显,没有人想要看到这样的代码(来自网络的一段烂代码):

cName = InpList.get(0).replace(",", ".");
                    cCode = InpList.get(1).replace(",", ".");
                    cAlpha2 = InpList.get(2).replace(",", ".");
                    cAbreviation = InpList.get(3).replace(",", ".");
                    dYear = InpList.get(4).replace(",", ".");
                    dPoliticalCompatibility = InpList.get(5).replace(",", ".");
                    dRankPoliticalCompatibility = InpList.get(6).replace(",", ".");
                    dEconomicCompatibility = InpList.get(7).replace(",", ".");
                    dRankEconomicCompatibility = InpList.get(8).replace(",", ".");
                    dMilitaryCompatibility = InpList.get(9).replace(",", ".");
                    dRankMilitaryCompatibility = InpList.get(10).replace(",", ".");
                    dDemoScore = InpList.get(11).replace(",", ".");
                    dRankDemoScore = InpList.get(12).replace(",", ".");
                    dEnviro
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱娃哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值