代码“可读性”到底有多重要?

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

易读!易读!易读!!

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

关于如何写出可读性强的代码,有很多好书值得详细阅读,《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之下。因为对于高手来说,应尽量减少注释,通过代码“自表性”来保证代码易读性。神说,自表性好的代码,就像美文一样。不过我辈功力不够,加一些注释来提高可读性还是必要的。不过,如果注释过多,那就说明代码本身需要好好设计一下了。

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值