嵌入式处理器发展到今天,速度已经很可观了。而产品的快速迭代,要求技术积累和技术细分,代码可继承性,即“可读性”的要求会越来越高。

易读!易读!易读!!

倘若对自己代码有要求,你会发现,它几乎是最重要的。神眼中的“优雅”,可能就蕴含在这里面。

关于如何写出可读性强的代码,有很多好书值得详细阅读,《C专家编程》、《代码大全》、《编程珠玑》,等等。这个课题很大,我只讲一些个人的心路历程:

代码1

uint32_t acf_tsk(uint64_t time_us)
{ACF_POOL.acf1_rxBit = GPIO_ReadInputDataBit(ACF_RX_GPIO_PORT, ACF_RX_PIN);if (ACF_POOL.acf_rxBit){ ACFAI_POOL.acf_timeTmp = time_us;ACFAI_POOL.acf_errFlg = ACF_FLG_F;}else{if ((ACF_POOL.acf_timeTmp + ACF_OT_TIME_US)<= time_us) ACF_POOL.acf_errFlg = ACF_FLG_T;else                                                   ACF_POOL.acf_errFlg = ACF_FLG_F;}return 0;
}

应该能看出作者想让“代码越集中越好”的企图,目的是实现“一个函数的内容在同一帧屏幕中显示,尽量减少鼠标滚轴操作”。这个函数很短,所以看不到效果。碰到大函数,又不好拆分成几个函数时,会更想这么干。

代码2:

uint32_t acf_tsk(uint64_t time_us)
{ACF_POOL.acf1_rxBit = GPIO_ReadInputDataBit(ACF_RX_GPIO_PORT, ACF_RX_PIN);if (ACF_POOL.acf_rxBit){ACFAI_POOL.acf_timeTmp = time_us;ACFAI_POOL.acf_errFlg = ACF_FLG_F;}else{if ((ACF_POOL.acf_timeTmp + ACF_OT_TIME_US)<= time_us){ACF_POOL.acf_errFlg = ACF_FLG_T;}else{ACF_POOL.acf_errFlg = ACF_FLG_F;}}return 0;
}

作者注意到了代码过分集中可能会影响排版,导致不同编辑环境下排版混乱。以及if分支最好带括号等等,看起来听进了前辈的谆谆教诲。

代码3:

uint32_t acf_tsk(uint64_t time_us)
{ACF_POOL.acf1_rxBit = GPIO_ReadInputDataBit(ACF_RX_GPIO_PORT, ACF_RX_PIN);if (ACF_POOL.acf_rxBit){ACFAI_POOL.acf_timeTmp = time_us;ACFAI_POOL.acf_errFlg = ACF_FLG_F;}else{if ((ACF_POOL.acf_timeTmp + ACF_OT_TIME_US)<=time_us){ACF_POOL.acf_errFlg = ACF_FLG_T;}else{ACF_POOL.acf_errFlg = ACF_FLG_F;}}return 0;
}

作者终于意识到,代码不是越集中越好,符合规范的结构,比如让大括号单独成行,反而看起来更加清晰、舒服,是更能避免笔误的好习惯。

代码4:

uint32_t acf_tsk(uint64_t time_us)
{ACF_POOL.acf1_rxBit = GPIO_ReadInputDataBit(ACF_RX_GPIO_PORT, ACF_RX_PIN);if (ACF_POOL.acf_rxBit){ACFAI_POOL.acf_timeTmp = time_us;ACFAI_POOL.acf_errFlg = ACF_FLG_F;}else{if ((ACF_POOL.acf_timeTmp + ACF_OT_TIME_US)<= time_us){ACF_POOL.acf_errFlg = ACF_FLG_T;}else{ACF_POOL.acf_errFlg = ACF_FLG_F;}}return 0;
}

作者注意到缩进的问题,即到底是用Tab键缩进,还是用空格键缩进。不统一就会带来混乱,换个编辑环境,这类问题很容易暴露,会极大影响阅读心情。我后来将keil编辑器的Tab键配置成了4个空格键,并且养成了缩进4个空格的习惯。

代码5:

uint32_t acf_tsk(uint64_t time_us)
{/* Get ACF RX pin. */ACF_POOL.acf1_rxBit = GPIO_ReadInputDataBit(ACF_RX_GPIO_PORT, ACF_RX_PIN);/* ACF error flag filter. */if (ACF_POOL.acf_rxBit){/* ACF bit is right.*/ACFAI_POOL.acf_timeTmp = time_us;ACFAI_POOL.acf_errFlg = ACF_FLG_F;}else{/* ACF bit is wrong.*/if ((ACF_POOL.acf_timeTmp + ACF_OT_TIME_US)<= time_us){ACF_POOL.acf_errFlg = ACF_FLG_T;}else{ACF_POOL.acf_errFlg = ACF_FLG_F;}}return 0;
}

作者突然想到,既然要增强可读性,那么加一些注释吧。于是就加了一些,并且不是很过分,还好。

总结:

代码1到代码5,代码内容是一模一样的,执行效果完全相同,但是可读性完全不同,是逐渐变得“优雅”起来的。这反映了近一年的时间里,我编写嵌入式代码的心路历程,也是逐渐养成编程好习惯的过程。

其实代码5的层次要在代码4之下。因为对于高手来说,应尽量减少注释,通过代码“自表性”来保证代码易读性。神说,自表性好的代码,就像美文一样。不过我辈功力不够,加一些注释来提高可读性还是必要的。不过,如果注释过多,那就说明代码本身需要好好设计一下了。

虽然,代码可读性是通过设计来实现的,但是其更加强有力的保障来自好的编程习惯。

身边有前辈说,看一个人的功力,那就搭眼看一下他的代码,立马就能判断出来,不用看细节。

简单记录一下成长轨迹,希望将来回头看这篇文章,会觉得自己好幼稚。

代码“可读性”到底有多重要?相关推荐

  1. 跟狗屎一样的代码,到底该如何重构?

    跟狗屎一样的代码,到底该如何重构? 跟大家分享一下,跟狗屎一样的代码,到底该如何重构?其实,代码都是不断改出来的,没有谁一开始就能写出漂亮的代码,因为需求都是不断变更的.在不断变更代码的时候,对代码进 ...

  2. python函数增强代码可读性_如何提高代码的可读性 学习笔记

    本文整理自 taowen 师傅在滴滴内部的分享. 1.Why 对一线开发人员来说,每天工作内容大多是在已有项目的基础上继续堆代码.当项目实在堆不动时就需要寻找收益来重构代码.既然我们的大多数时间都花在 ...

  3. 如何提高游戏陪玩app源码的代码可读性?

    1.Why 对一线开发人员来说,每天工作内容大多是在已有游戏陪玩app源码的基础上继续堆代码.当游戏陪玩app源码实在堆不动时就需要寻找收益来重构代码.既然我们的大多数时间都花在坐在显示器前读写代码这 ...

  4. 如何提升代码可读性?阿里发布16条设计规约

    脍炙人口的唐诗"两个黄鹂鸣翠柳,一行白鹭上青天",清爽直接,简明易懂.可读性好的代码也是让人陶醉的,那么如何写出可读性的代码? 近期,<阿里巴巴Java开发手册>推出详 ...

  5. pandas数据处理 代码_使用Pandas方法链接提高代码可读性

    pandas数据处理 代码 We have been talking about using the Pandas pipe function to improve code readability. ...

  6. python函数增强代码可读性_写Python必须知道的这几个代码技巧!你会吗?

    Day09 函数的初始 函数:函数是以功能为导向,一个函数封装一个功能.登录,注册,文件的改的操作... 函数减少代码的重复性,增强了代码的可读性: 获取任意一个字符串的元素的个数 s1 = &quo ...

  7. 提升代码可读性的 10 个技巧

    具有较强可读性的代码,能帮助你调试程序,不让自己活得太累. 代码可读性是计算机编程领域中普遍存在的问题.这也是我们成为开发者首先要学习的事情之一.本文会详细介绍在编写强可读性代码时最佳实践中最重要的一 ...

  8. 改善代码可读性的5种方法

    在本文中,我会列举五条提高代码可读性的原则.这些原则是我在各种项目.团队和组织的实践中总结出来的经验.我希望大家可以从这篇文章中学到一些东西,从而提高代码的可读性. >>>> ...

  9. 提高代码可读性: 命名技术

    提高代码可读性,首推<代码整洁之道>一书.亦可参考 <Java编程规范>. 提高代码可读性直接有利于提高系统的可维护性.如果那些什么事都不做的抽象有什么益处的话,至少它提高了代 ...

最新文章

  1. 设置user-agent骗过服务端安全检查
  2. 智源LIVE丨北大贾金柱:更优的协变量调整的平均因果作用估计
  3. mysql 包含非数字_mysql 正则表达式查询含有非数字和字符的记录
  4. svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法
  5. 桌面计算机休眠快捷键,如何快速建立Win 7桌面一键休眠快捷方式
  6. 【win32汇编】0x01 开篇一些乱七八糟的话
  7. 用隐马尔可夫模型(HMM)做命名实体识别——NER系列(二)
  8. 关于easyUI在子页面增加显示tabs的一个问题
  9. mysql配置文件my.cnf的事例并附解释
  10. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步怪物运动简单AI
  11. paip.提升性能------服务器环境及编程语言架构选择
  12. (一)事务与并发控制
  13. python读取txt文件并将其转换为Dataframe格式
  14. go语言的魔幻旅程28-go命令
  15. 三酷猫学python_python学习06循环
  16. 【Flutter 实战】全局点击空白处隐藏键盘
  17. 简单弄懂Saas是什么? Saas与传统软件有什么区别?
  18. 上墙抽奖php代码,微信帐号开发:独立PHP微信上墙|微信墙|微信抽奖完美版(PHP源码)...
  19. 我在网络上看到的PDM的概念、定义、优缺点等相关信息
  20. 如何使用Hadoop读写数据库

热门文章

  1. mysql服务账号密码忘记_windows mysql 账号密码忘了怎么办
  2. Python 从函数 def 到类 Class
  3. 删除flash助手推荐广告
  4. 腾讯课堂直播: 手把手教你开发《3D街头篮球》
  5. 你来讲讲AQS是什么吧?都是怎么用的?
  6. 计算机暑期学校心得,暑期学校培训心得体会(通用12篇)
  7. Lost connection to MySQL server during query的几种可能分析
  8. 企业做短视频常见的3问题:太真实了
  9. OPENWRT 修改串口(ttyS*)笔记
  10. C语言新手记:相邻数对