0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何才能让代码更简单?

Q4MP_gh_c472c21 来源:技术让梦想更伟大 作者:李肖遥 2021-03-17 09:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

不知道大家有没有这样的经历,当你来到一个新的公司或者是接手一个新的项目的时候,最怕的就是看前任的代码(外加没有文档),最气人的还是,连简单的注释都没有多少,每当遇到这种情况都想把前任程序员拉出来毙了。

吐槽归吐槽,谁的新欢不是谁的旧爱呢?自己写完的项目可能也要交给后来人,那我们可能是想被毙掉的那一位了。我仔细想了想,可能一切的锅都得归于我们写代码时候的炫技。

程序语言都会提供这样的或者那样的特性,这些特性在某些时候可以帮助我们省些代码或者在特定情况帮助我们减少失误带来的影响。我相信存在即合理,然而语言的有些特性并不是什么好东西,很多特性都经不起时间的考验(代码的不断迭代),最后带来的bug可能很难找到。

还有一点,我相信每个程序员都想要写好代码,或者认为短小精悍的代码才算好。我们也会经常吹牛逼说:这个功能别人要写100行,我不到一半行就搞定了。不是说不好,但是很多情况,利用语言里的一些特殊构造来缩减代码可能会让人难以理解。

也就是说:并不是语言提供什么特性,我们就一定要使用起来。实际上我们只需要其中很小的一部分功能,就能写出优秀的代码,实现特定的功能。

下面我根据一些经验,针对一些有问题的语言特性,规范一些代码,为什么这样能让代码更简单。

切记不要省略花括号

这个相信大家都有体会,也是经常会这么用的,比如:

if (condition1) action1();

而不是

if (condition1){ action1(); }

这种情况最起码可以省了一两行代码了,而且也还算是很好看。但是这样也会经常引起一些意想不到的问题,比如,在后面想要多加一句话action2()到这个if里面,有可能会把代码改成:

if (condition1) action1(); action2();

这可不是python,当我们都有缩进的时候,潜意识里肯定是以为它们是在一起的,以为它们只会在if的条件为真的时候执行,然而action2()却其实在if外面,它会被无条件的执行。

看似很简单的问题,可能都很容易发现这个错误,但实际上却容易被忽视。只要是if-else语句,把花括号全都打上,就可以不用担心漏掉了,相当于没这个特性,这样就可以保持完全的一致性,减少不必要的思考。

if (condition1){ action1(); action2(); }

避免使用自增减表达式(i++,++i,i–,–i)

我们总喜欢骚操作,在我之前写过的一篇文章中 浅析C语言中一些“令人吃惊”的结构 ,表明C语言会同意一些“令人震惊”的结构,但实际上自增减操作表达式其实是历史遗留的设计失误。

像是c = a+++++b;这种类型的表达式含义比较蹊跷,非常容易弄错,混淆缠绕在一起,把语义搞得乌七八糟。

这种表达式的结果可能取决于求值顺序,在某种编译器下能正确运行,换一个编译器就可能出现离奇的错误了,当然这个我并没有验证,但这种看起来太骚了。

如果你想写function(i++),你完全可以把它拆成

int t = i; i += 1; function(t);

这两个表达式分解成两步,如果想写function(++i),可以拆成

i += 1; function(i);

拆开之后的代码,含义完全一致,却清晰很多。到底更新是在取值之前还是之后,一目了然。

当然我们也会有更细致的争论,例如:i++或者++i的效率比拆开之后要高,当看到这种究根源的结论我其实是很感兴趣的,但实际上这些代码经过基本的编译器优化之后,生成的机器代码是完全没有区别的。

而且自增减表达式只有在for循环的update部分、写成单独的一行这两种情况下才可以安全的使用,这两种情况是完全没有歧义的。其余情况需要避免使用,比如用在复杂的表达式里面,比如function(i++),function(++i)等等。

合理使用括号

使用括号可以确保表达式的优先级,而我们总是不大喜欢在表达式中添加括号,但是盲目依赖操作符优先级往往得不偿失。

当然对于简单的加减乘除我们可以使用,比如1+4*9,而不需要写成1+(4*9),然而在一些稍微复杂一点的表达式中我们可能不喜欢括号,比如1《《2+4*9。

当然,这也考研我们的基本功,但我相信移位操作《《的优先级,大部分人第一眼可能是不大熟悉的,所以这导致了我们再一次废了多一点脑子或者Google了一下。

由于x 《《 1相当于把x乘以2,那么这个表达式可能会被误以为(1《《2)+(4*9),然而实际上《《的优先级比加法+还要低,所以这表达式其实相当于1《《(2+4*9)

解决这个问题的办法,不是要求每个人都去把操作符优先级表给硬背下来,而是合理的加入括号。虽然没有括号也表示同样的意思,但是加上括号就更加清晰了,是不是呢?

总结

再次声明,这里只是举了几个简单的例子,所谓存在即合理,特性既然存在肯定是在某种特定情况下有用武之地的,这一点我们毋庸置疑。

但实际到我们自己敲的代码,或者在工程应用中,为了避免花过多的时间与精力放在这种费眼睛、费脑子的事情上,是适得其反的。

我们需要写简单的代码,需要看简单的代码,需要没有歧义与争论的代码,这才是我们的终极目标,希望本文所阐述的思想对大家有用处。

原文标题:如何写简单的代码?

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4985

    浏览量

    74565

原文标题:如何写简单的代码?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何配置才能让ADL5202正常工作 verilog代码方面要什么要求吗?

    的问题)问题还是我代码的问题,想问问大家ADL5202正常工作时,管脚的电压配置应该是?那些引脚要拉高或者拉低?verilog代码方面要什么要求吗?(我按照手册对其管脚进行了测试,没有发现什么不对的)(有点着急)
    发表于 05-21 08:12

    Debian 69未检测到Intenso NVME,怎样才能让它工作?

    嘿。我刚刚设法更新到 2.5.0 并启动了 Debian 版本 69。 但未检测到我的新 NVME SSD它在闪烁,但也许我必须做其他事情然后将其内置? 我怎样才能让它工作? 谢谢
    发表于 03-25 06:38

    SonarQube代码质量管理平台详解

    代码质量问题是技术债务的主要来源。一个未被发现的空指针异常可能在生产环境导致服务崩溃,一段存在SQL注入漏洞的代码能让整个数据库暴露在攻击者面前。传统的Code Review依赖人工审查,效率低下且容易遗漏。
    的头像 发表于 03-11 09:40 524次阅读

    其利天下FOC方案:为什么能让直流无刷水泵静音、节能、更可靠?

    传统水泵正面临向高效、静音、智能化升级的行业拐点 。其利天下推出的直流无刷水泵专用 FOC 方案,并非简单的部件更换,而是通过算法、硬件与设计的深度协同,从根源上重构水泵的驱动内核。 一、静音:从
    的头像 发表于 01-23 19:08 1902次阅读
    其利天下FOC方案:为什么<b class='flag-5'>能让</b>直流无刷水泵<b class='flag-5'>更</b>静音、<b class='flag-5'>更</b>节能、更可靠?

    TQKIT开发板工具让系统功能调用简单

    TQKIT开发板工具,将复杂的系统控制能力以接口形式开放给开发者,让系统功能调用简单
    的头像 发表于 12-08 09:27 603次阅读
    TQKIT开发板工具让系统功能调用<b class='flag-5'>更</b><b class='flag-5'>简单</b>

    编写简单高效单片机汇编程序

    ,避免重复编写。 宏指令:编写重复代码块时,把它封装为宏指令,并用传参简化,比如显示数字(数码管号, 数值)。这样能让代码简洁。 子程序调用:像时钟显示刷新这种逻辑,可以写成子程序
    发表于 11-24 07:00

    怎么能让riscv32-unknown-elf-gcc支持e203?

    https://github.com/ilg-archived/riscv-none-gcc 自己在这个地方下载的riscv32-unknown-elf-编译器代码 ./configure
    发表于 11-10 07:06

    力芯微LCD驱动IC:高集成度“芯”优势让显示简单

    在当今数字化时代,显示屏无处不在。然而,随着设备小型化、高性能化的需求不断增加,如何在有限的空间内实现更强大的显示功能,成为了一个亟待解决的问题。力芯微LCD驱动IC:高集成度“芯”优势让显示简单
    的头像 发表于 10-15 16:08 1135次阅读
    力芯微LCD驱动IC:高集成度“芯”优势让显示<b class='flag-5'>更</b><b class='flag-5'>简单</b>

    代码格式化工具Clang-Format提升你的CW32工程质量

    它能自动统一团队代码风格,让不同开发者写出的代码如出一辙。就像 CW32 官方库函数遵循统一规范一样,Clang-Format 能让团队所有成员的代码瞬间保持一致,彻底消除 "tabs
    的头像 发表于 10-09 17:43 1382次阅读
    <b class='flag-5'>代码</b>格式化工具Clang-Format提升你的CW32工程质量

    嵌入式达到什么水平才能就业?

    很多想入行嵌入式的朋友,都在纠结:自己得学到啥水平,才能找到工作?要是现在还没达到这种水平/刚想入行嵌入式,现在开始学还来得及嘛?别慌,今天就来好好聊聊~ 嵌入式就业,需要达到这些水平: (一
    发表于 09-15 10:20

    告别代码迷宫!exgnss扩展库让GNSS定位开发秒变简单

    还在为GNSS定位的复杂代码头疼?exgnss扩展库为你扫清障碍!它提供简洁的接口和高效的工具链,从信号捕获到坐标解析一气呵成,开发效率直线飙升。 一、exgnss库的三种应用模式 exgnss库
    的头像 发表于 09-10 17:23 983次阅读
    告别<b class='flag-5'>代码</b>迷宫!exgnss扩展库让GNSS定位开发秒变<b class='flag-5'>简单</b>

    嵌入式系统中,FLASH 中的程序代码必须搬到 RAM 中运行吗?

    Flash,通常都是让代码直接在 Flash 里运行。这类芯片的设计侧重成本,面对的任务也多是简单的控制逻辑,比如玩具里的动作控制、传感器的数据采集等,Flash 虽
    的头像 发表于 08-06 10:19 1607次阅读
    嵌入式系统中,FLASH 中的程序<b class='flag-5'>代码</b>必须搬到 RAM 中运行吗?

    千视产品全面升级|用技术赋能效率,让专业简单

    为持续提升用户体验,千视电子近期对全系核心产品进行重大功能升级。本次更新聚焦于提升协同效率、增强录制灵活性、简化系统操作,助力客户在各类IP化制作场景中实现更高效、更稳定、智能的操作体验。1N60
    的头像 发表于 07-15 16:45 1103次阅读
    千视产品全面升级|用技术赋能效率,让专业<b class='flag-5'>更</b><b class='flag-5'>简单</b>

    使用stm32u575rg通过spi读取外置adc的数据,如何设置才能让spi不需要中断重启持续读取数据?

    DBL_1=3,DINC=1, BNDT=64. 测试时候发现SPI只能读取2组数据,共8个字节,EOT=1. 需要开启EOT中断然后再中断函数中重新关闭再开启SPI才能继续读数据。如何设置才能让spi不需要中断重启持续读取数据
    发表于 07-10 08:22

    企业和个人基于业务知识和代码库增强的大模型生成代码实践

    :“这个功能之前做过类似的,你参考下历史代码。”可当他打开代码仓库,却发现注释寥寥,变量名像密码一样难懂,找不到任何需求文档。他硬着头皮修改,结果上线后引发了线上故障——原来有个隐藏的业务规则,只有老员工才知道。 第二周:
    的头像 发表于 07-08 15:31 573次阅读
    企业和个人基于业务知识和<b class='flag-5'>代码</b>库增强的大模型生成<b class='flag-5'>代码</b>实践