2614|2

114

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

如何读懂别人的代码(上) [复制链接]

对于IT相关从业人员来说,看别人代码是必不可少的磨难。在学习阶段,我们经常需要从书上看别人的代码以吸取宝贵经验,这是相当枯燥无趣的过程,也时常无法领会作者的意图。在实际工作中,不可避免的出现需要接手做到一半的项目或是团队合作的项目,这时候就必须看以前的工程师的代码。如果说看书上的代码用痛苦来形容的话,那么这种情况时遇到代码不够规范或者设计不合理,简直就是苦不堪言。还有一些神一般的选手,设计者在编写代码时的“灵机一动”,其结果只有他自己和上帝才看得懂。这些代码能看得你觉得生不如死,甚至开始怀疑人生:到底是代码写得混乱or我水平不行?!你以为这是最痛苦的吗?NO!还有一种情况足以令你看得生不如死,甚至开始怀疑人生。那就是遇到运行不正常的代码,对问题排查错误花的时间和精力还不如重新写一遍,这时你的内心完全是崩溃的!
有一件事非常无奈,我们不可能要求别人的代码都非常规范。所以,正确的学习方法和思维方式尤为重要。怎样看他人代码才是正确的方式?看代码之前应该做些什么准备工作?看代码用正向思维还是逆向思维?如何判断代码中哪些地方是否值得借鉴?由此,掌握到一种通用的去看懂别人代码的技巧显得非常重要。下面我们就来谈谈这方面。
我们知道,而实现功能可能有很多种方法,所以不同的人写出的代码不相同。通过看代码去知道它要实现的是什么功能是一件很困难的事情。有些初学者会想到采取仿真一下、看电路图、流程图、时序图、注释等等方法,都是不可取的,通过这些你还是无法知道它的功能,以及有没有错误。
那么正确的方法是什么呢?我们采取一种可称之为“反推法”或是“逆向法”的方式,这个问题就迎刃而解了。要知道,代码的目的是实现功能。无论你用那种代码,有一点完全相同的就是“实现功能”这个最终结果。了解到这一点,我们就可以通过结果(功能)去反推过程(代码),代码的思路、流程、用途就抽丝剥茧清晰的显露出来。好的,下面我们举个实例来说明怎么通过反推法有步骤的去看懂别人的代码。
代码1。
如果我们按照自上而下的顺序去看这个代码,通过代码的过程去看实现的功能会是很困难的事,甚至看不明白它要实现的是什么功能。Ok,我们现在从功能看起,这个代码要实现的是“帧率采样计算”这个功能,可以理解为图片每秒显示多少帧数。
1. 从代码中我们可以看出,CMOS_FPS_DATA这个信号是我们所要求的信号(一秒内的帧数率);
2. CMOS_FPS_DATA<= fps_data >>1在一段时间内保持不变,才是我们所要的结果;
3. 从CMOS_FPS_DATA<= fps_data >>1中可以看出,CMOS_FPS_DATA是通过fps_data 这个信号来实现;
4. fps_data这个信号是怎么来的?反推到fps_data <= 0和fps_data<= fps_data + 1'b1这两个信号。fps_data复位为零,在else if(Frame_valid)条件下加1;因此fps_data为帧数率标志信号;
5. 从CMOS_FPS_DATA<= fps_data >>1中可以看出是通过<= fps_data>>1右移一位,也就是说除以2得到这个值的;
6. 为什么要fps_data除以2来得到这个值?于是反推到if(delay_2s == 0)这个条件。
现在作者的意图就非常清晰了。满足帧数率的情况下不断+1,到2秒时间时根据统计结果除以2,由此得到1秒时间的帧数。到此为止,我们已经可以非常容易的看懂这个代码了。
通过反推法我们也能比较容易的去看代码是否有错误。首先我们去知道代码需要实现的功能,通过反推法得知是通过什么方法实现的,进而仿真时定位其目标,去看该代码是否完成了功能。如果没有完成功能,那么代码就有误。
对于学习者来说,反推法的意义还不仅在此。在本例中,这个设计思路完全满足功能要求。这时,我们应该扩展思考,本例是通过2秒来实现功能,为什么要用2秒?是否可以直接通过1秒,或是3秒,或是其他方案来实现呢?各种方法的优缺点在哪里?通过反推法得知作者实现项目的方法并思考,这种方法正确还是错误?如果是错误或者这种方法不太好,那么我们如何避免?如果是优秀的代码,我们如何借鉴并能举一反三地运用到其他项目中去?本例只是选取项目中的一个小的节点,对于看整个项目的代码来说可以运用反推法吗?敬请关注下一节:《如何看懂别人的代码(下)》。


此内容由EEWORLD论坛网友njiggih原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自FPGA/CPLD论坛

最新回复

怎么论坛里没有你举例的代码??  详情 回复 发表于 2017-12-22 09:51
点赞 关注
个人签名官网:www.mdy-edu.com
 

回复
举报

114

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
本帖最后由 njiggih 于 2017-12-13 15:56 编辑

无论是学习还是工作中,难免都要阅读他人的代码。但这一过程许多人都感觉非常痛苦:不明白作者的意图,不明白为什么要有这个信号,这个信号有什么用,作者到底是如何想到这个信号的。理解代码都非常困难,更别说是定位问题,修改错误了。其实阅读他人代码不痛苦,关键是用正确的思维方式和阅读方法。本期公开课,潘老师将教授大家如何高效地阅读他人代码,快速实现学习和完成项目的目的。
http://www.mdy-edu.com/product/586.html




此帖出自FPGA/CPLD论坛
个人签名官网:www.mdy-edu.com
 
 

回复

38

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
怎么论坛里没有你举例的代码??
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表