对于IT相关从业人员来说,看别人代码是必不可少的磨难。在学习阶段,我们经常需要从书上看别人的代码以吸取宝贵经验,这是相当枯燥无趣的过程,也时常无法领会作者的意图。在实际工作中,不可避免的出现需要接手做到一半的项目或是团队合作的项目,这时候就必须看以前的工程师的代码。如果说看书上的代码用痛苦来形容的话,那么这种情况时遇到代码不够规范或者设计不合理,简直就是苦不堪言。还有一些神一般的选手,设计者在编写代码时的“灵机一动”,其结果只有他自己和上帝才看得懂。这些代码能看得你觉得生不如死,甚至开始怀疑人生:到底是代码写得混乱or我水平不行?!你以为这是最痛苦的吗?NO!还有一种情况足以令你看得生不如死,甚至开始怀疑人生。那就是遇到运行不正常的代码,对问题排查错误花的时间和精力还不如重新写一遍,这时你的内心完全是崩溃的!
有一件事非常无奈,我们不可能要求别人的代码都非常规范。所以,正确的学习方法和思维方式尤为重要。怎样看他人代码才是正确的方式?看代码之前应该做些什么准备工作?看代码用正向思维还是逆向思维?如何判断代码中哪些地方是否值得借鉴?由此,掌握到一种通用的去看懂别人代码的技巧显得非常重要。下面我们就来谈谈这方面。
我们知道,实现功能可能有很多种方法,所以不同的人写出的代码不相同。通过看代码去知道它要实现的是什么功能是一件很困难的事情。有些初学者会想到采取仿真一下、看电路图、流程图、时序图、注释等等方法,都是不可取的,通过这些你还是无法知道它的功能,以及有没有错误。
那么正确的方法是什么呢?我们采取一种可称之为“反推法”或是“逆向法”的方式,这个问题就迎刃而解了。要知道,代码的目的是实现功能。无论你用那种代码,有一点完全相同的就是“实现功能”这个最终结果。了解到这一点,我们就可以通过结果(功能)去反推过程(代码),代码的思路、流程、用途就抽丝剥茧清晰的显露出来。好的,下面我们举个实例来说明怎么通过反推法有步骤的去看懂别人的代码。[img]
http://dl2.iteye.com/upload/attachment/0130/6776/f210ee39-5b3b-3f27-a781-9cc41df8de98.png[/img]
如果我们按照自上而下的顺序去看这个代码,通过代码的过程去看实现的功能会是很困难的事,甚至看不明白它要实现的是什么功能。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秒,或是其他方案来实现呢?各种方法的优缺点在哪里?通过反推法得知作者实现项目的方法并思考,这种方法正确还是错误?如果是错误或者这种方法不太好,那么我们如何避免?如果是优秀的代码,我们如何借鉴并能举一反三地运用到其他项目中去?本例只是选取项目中的一个小的节点,对于看整个项目的代码来说可以运用反推法吗?敬请关注下一节。
想要了解更多技术文章,欢迎关注http://www.mdy-edu.com/product/list/35
- 大小: 27.9 KB
分享到:
相关推荐
粒度反推法的工作空间
使用反推技术,使你的网站秒引蜘蛛秒收录 使用说明: 1.导入链接,开头必须带http://,末尾必须带/,一行一条 2.导入你的百度账号COOKIE,一行一条 3.接入打码平台 4.即刻开启秒收录 反推是什么: 模拟快照链接,...
四、反推装置的应用实例 反推装置已经在许多大型飞机上应用,例如波音747、空客A380等。反推装置的应用可以减少飞机的滑跑距离,提高机场的安全性和效率。 五、反推装置的要求 反推装置需要满足一定的要求,例如...
逆向工程中需要了解PE文件的细节,此文档资料就值得读下 适合于结合反编译,和反汇编工具使用
DWR(Direct Web Remoting)是一种Java库,用于在Web应用程序中实现实时通信,它允许...通过理解DWR的工作原理、配置、API使用以及反推机制,开发者可以更好地掌握在Web应用中实现实时通信的技术,提升用户体验。
在"**dwr反推简单例子**"中,我们将会探讨如何使用DWR进行数据的反向推送,即由服务器主动向客户端推送数据,而不仅仅是响应客户端的请求。 首先,DWR的核心概念包括三个主要部分:`Engine`、`Configuration`和`...
地震反演是地球物理学中的重要技术,它通过分析地震波数据来反推地壳内部的物理特性。其中,贝叶斯方法在地震反演领域应用广泛,因其能够处理不确定性并提供概率解释。本文将围绕"deleivery"这一基于贝叶斯地震反演...
进行PCB(印刷电路板)原理图反推是一个涉及电子电路分析、理解以及细节处理的技术过程。这一过程要求工程师具备扎实的电子电路知识、PCB设计原理以及逆向思维能力。在进行反推时,工程师需要根据实际的PCB电路板来...
在现代电子系统设计中,使用SRAM基FPGA(现场可编程门阵列)技术的应用十分广泛。SRAM型FPGA的一个核心问题是,由于其配置数据保存在易失性存储器中,一旦设备断电,配置数据就会丢失。因此,为了确保FPGA在每次上电...
讲述ajax的反推讲述ajax的反推讲述ajax的反推讲述ajax的反推讲述ajax的反推讲述ajax的反推
上个版本由于没有过滤因刷新页面生成的无效ScriptSession,这么做会导致服务器压力过大,甚至完不成任务。所以制作了这个升级版的——添加了使用dwr3中的ScriptSessionListener过滤无效的scriptSession。
总结,DWR2.x的反推技术是提升Web应用实时交互体验的关键工具,它通过服务器主动推送数据,改变了传统的请求-响应模式,简化了开发流程,优化了系统性能。理解并熟练掌握DWR反推,对于构建高效的Ajax应用至关重要。
服务器反推技术是一种在Web应用中实现即时通信的策略,它与传统的客户端发起请求、服务器响应的模式相反,由服务器主动向客户端推送数据。在即时聊天系统中,服务器反推技术是至关重要的,因为它能够实现实时的消息...
文中列举了多个时间段内左发反推灯亮的故障实例,包括反推放出相关代码(如S831、S835、S834、S832、S836)以及发现的硬件问题,如D3052插头烧蚀。这些现象表明反推系统在执行放出和收回动作时存在异常。 二、反推...
在ELO反推代码中,README可能会解释如何使用这个程序,比如输入格式、预期输出和可能的命令行参数。 5. **编程实践**:理解并实现ELO反推公式可以提升编程技能,特别是处理数据和算法的能力。这也可以帮助开发者...
区域OD矩阵反推是交通...基于改进遗传算法的区域OD矩阵反推研究,不仅在理论上对改进的遗传算法做了详细说明,还通过实例验证了方法的有效性,为交通规划和管理提供了可靠的数据支撑,具有重要的实用价值和研究意义。
CRC32反推 软件 1-5字节明文 0.几秒 6字节明文 平均1.1秒左右 程序无毒!!!!
这种技术的核心在于反推(Reverse Ajax),即服务器主动向客户端推送数据,而不仅仅是响应客户端的请求,极大地提高了用户体验,尤其是在需要实时更新的应用场景中,比如在线聊天应用。 在Spring框架中整合DWR,...
在数字信号处理和嵌入式系统设计中,FPGA(Field-Programmable Gate Array)是一种广泛应用的硬件平台,它允许设计者通过编程实现复杂的逻辑功能。本篇将深入探讨如何利用Verilog语言在FPGA上实现CORDIC(Coordinate...