"); //-->
对于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秒,或是其他方案来实现呢?各种方法的优缺点在哪里?通过反推法得知作者实现项目的方法并思考,这种方法正确还是错误?如果是错误或者这种方法不太好,那么我们如何避免?如果是优秀的代码,我们如何借鉴并能举一反三地运用到其他项目中去?本例只是选取项目中的一个小的节点,对于看整个项目的代码来说可以运用反推法吗?敬请关注下一节:《如何看懂别人的代码(下)》。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
ATmega48or88or168的开发
TI Smart Motor Driver
飞思卡尔完善的永磁同步电机无位置传感器矢量控制解决方案
是德科技对可再生能源前瞻:向绿而行,推进可持续发展
AT命令集
Spansion飞索半导体FL-S高速闪存系列新闻发布会
交流电机控制方法及实现
att7022b(不同于att7022)
自动稳压电源电路
ATmega48or88or168的程序移植参考
Supermicro高性能服务器开始量产供货,可针对AI、高性能计算、虚拟化以及边缘端工作负载优化
传台积电拒绝代工三星Exynos芯片,认为商业机密存在泄露风险
大联大友尚集团推出基于ST产品的11kW双向电池充电器方案
在PCB生产过程中,是如何控制走线阻抗的?
嵌入式软件OTA升级,有哪几种FLASH划分方式?
常见维修电路板技术汇总
由集成电路和双向可控硅构成的自动调压式稳压电源电路
第1000个帖子
110~380V交流自动稳压电源电路
信息化改造装备逞能伊拉克战场
基于TCP/IP网络的管理结构和标记
LG推出第四代OLED电视面板:亮度提高33%,针对AI时代优化
330W交流稳压电源电潞
BD-14型转子二点接地保护
中国微特电机行业现状与发展趋势
英伟达或于3月推出CPO交换机新品
传特斯拉上海厂部分产线春节停产三周,为量产焕新版Model Y做准备
转miracleno1帖,请帮忙!
每天早晚二十分钟,让你的人生从此不同。
三菱FR-F540变频器典型接线图