如何讀懂別人的代碼(上)

發(fā)布時(shí)間:2017-12-12 15:01    發(fā)布者:chunfen26341612
關(guān)鍵詞: 代碼 , ALTERA , XILINX , VERLIOG
對于IT相關(guān)從業(yè)人員來(lái)說(shuō),看別人代碼是必不可少的磨難。在學(xué)習階段,我們經(jīng)常需要從書(shū)上看別人的代碼以吸取寶貴經(jīng)驗,這是相當枯燥無(wú)趣的過(guò)程,也時(shí)常無(wú)法領(lǐng)會(huì )作者的意圖。在實(shí)際工作中,不可避免的出現需要接手做到一半的項目或是團隊合作的項目,這時(shí)候就必須看以前的工程師的代碼。如果說(shuō)看書(shū)上的代碼用痛苦來(lái)形容的話(huà),那么這種情況時(shí)遇到代碼不夠規范或者設計不合理,簡(jiǎn)直就是苦不堪言。還有一些神一般的選手,設計者在編寫(xiě)代碼時(shí)的“靈機一動(dòng)”,其結果只有他自己和上帝才看得懂。這些代碼能看得你覺(jué)得生不如死,甚至開(kāi)始懷疑人生:到底是代碼寫(xiě)得混亂or我水平不行?!你以為這是最痛苦的嗎?NO!還有一種情況足以令你看得生不如死,甚至開(kāi)始懷疑人生。那就是遇到運行不正常的代碼,對問(wèn)題排查錯誤花的時(shí)間和精力還不如重新寫(xiě)一遍,這時(shí)你的內心完全是崩潰的!
有一件事非常無(wú)奈,我們不可能要求別人的代碼都非常規范。所以,正確的學(xué)習方法和思維方式尤為重要。怎樣看他人代碼才是正確的方式?看代碼之前應該做些什么準備工作?看代碼用正向思維還是逆向思維?如何判斷代碼中哪些地方是否值得借鑒?由此,掌握到一種通用的去看懂別人代碼的技巧顯得非常重要。下面我們就來(lái)談?wù)勥@方面。
我們知道,而實(shí)現功能可能有很多種方法,所以不同的人寫(xiě)出的代碼不相同。通過(guò)看代碼去知道它要實(shí)現的是什么功能是一件很困難的事情。有些初學(xué)者會(huì )想到采取仿真一下、看電路圖、流程圖、時(shí)序圖、注釋等等方法,都是不可取的,通過(guò)這些你還是無(wú)法知道它的功能,以及有沒(méi)有錯誤。
那么正確的方法是什么呢?我們采取一種可稱(chēng)之為“反推法”或是“逆向法”的方式,這個(gè)問(wèn)題就迎刃而解了。要知道,代碼的目的是實(shí)現功能。無(wú)論你用那種代碼,有一點(diǎn)完全相同的就是“實(shí)現功能”這個(gè)最終結果。了解到這一點(diǎn),我們就可以通過(guò)結果(功能)去反推過(guò)程(代碼),代碼的思路、流程、用途就抽絲剝繭清晰的顯露出來(lái)。好的,下面我們舉個(gè)實(shí)例來(lái)說(shuō)明怎么通過(guò)反推法有步驟的去看懂別人的代碼。
代碼1。
如果我們按照自上而下的順序去看這個(gè)代碼,通過(guò)代碼的過(guò)程去看實(shí)現的功能會(huì )是很困難的事,甚至看不明白它要實(shí)現的是什么功能。Ok,我們現在從功能看起,這個(gè)代碼要實(shí)現的是“幀率采樣計算”這個(gè)功能,可以理解為圖片每秒顯示多少幀數。
1. 從代碼中我們可以看出,CMOS_FPS_DATA這個(gè)信號是我們所要求的信號(一秒內的幀數率);
2. CMOS_FPS_DATA<= fps_data >>1在一段時(shí)間內保持不變,才是我們所要的結果;
3. 從CMOS_FPS_DATA<= fps_data >>1中可以看出,CMOS_FPS_DATA是通過(guò)fps_data 這個(gè)信號來(lái)實(shí)現;
4. fps_data這個(gè)信號是怎么來(lái)的?反推到fps_data <= 0和fps_data<= fps_data + 1'b1這兩個(gè)信號。fps_data復位為零,在else if(Frame_valid)條件下加1;因此fps_data為幀數率標志信號;
5. 從CMOS_FPS_DATA<= fps_data >>1中可以看出是通過(guò)<= fps_data>>1右移一位,也就是說(shuō)除以2得到這個(gè)值的;
6. 為什么要fps_data除以2來(lái)得到這個(gè)值?于是反推到if(delay_2s == 0)這個(gè)條件。
現在作者的意圖就非常清晰了。滿(mǎn)足幀數率的情況下不斷+1,到2秒時(shí)間時(shí)根據統計結果除以2,由此得到1秒時(shí)間的幀數。到此為止,我們已經(jīng)可以非常容易的看懂這個(gè)代碼了。
通過(guò)反推法我們也能比較容易的去看代碼是否有錯誤。首先我們去知道代碼需要實(shí)現的功能,通過(guò)反推法得知是通過(guò)什么方法實(shí)現的,進(jìn)而仿真時(shí)定位其目標,去看該代碼是否完成了功能。如果沒(méi)有完成功能,那么代碼就有誤。
對于學(xué)習者來(lái)說(shuō),反推法的意義還不僅在此。在本例中,這個(gè)設計思路完全滿(mǎn)足功能要求。這時(shí),我們應該擴展思考,本例是通過(guò)2秒來(lái)實(shí)現功能,為什么要用2秒?是否可以直接通過(guò)1秒,或是3秒,或是其他方案來(lái)實(shí)現呢?各種方法的優(yōu)缺點(diǎn)在哪里?通過(guò)反推法得知作者實(shí)現項目的方法并思考,這種方法正確還是錯誤?如果是錯誤或者這種方法不太好,那么我們如何避免?如果是優(yōu)秀的代碼,我們如何借鑒并能舉一反三地運用到其他項目中去?本例只是選取項目中的一個(gè)小的節點(diǎn),對于看整個(gè)項目的代碼來(lái)說(shuō)可以運用反推法嗎?敬請關(guān)注下一節:《如何看懂別人的代碼(下)》。

本文地址:http://selenalain.com/thread-520838-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页