程式碼是靈魂 註釋是心聲
在以前一些關於程式碼註釋的文章中,我發現,你不需要的註釋才是最好的註釋。不要急著批判,請允許我闡述一下。首先程式碼應該儘量地簡潔,儘可能地做到不需要依賴註釋就可以理解。只有那些真的沒法更易於理解的程式碼,才需要我們新增註釋。
有一本非常經典的書叫《Structure and Interpretation of Computer Programs》(《電腦程式的結構和編譯》),最初發表於1985年,在序言中就表明其觀點:
程式必須能便於我們閱讀,讓機器執行只是附帶的。
Knuth也在他1984年發表的經典論文《Literate Programming》(《文學程式設計》)中秉持了類似的觀點:
我們應該轉變傳統的思維,程式不再是告訴計算機做什麼的指令,而是向人類描述如何讓計算機做事情的文字,程式設計像寫文章一樣。
文學程式設計關注的主要是展現精緻的風格。程式設計師應該像作家一樣,認真地選擇變數名,並解釋每個變數的意思,努力寫出易於人腦理解的程式。
如果你寫出來的程式碼,既能被其他程式設計師理解又能成功編譯,那麼需要新增註釋的地方肯定就不會很多。關於使用註釋作為輔助工具,下面就是一個頗具代表意義的例子:
這段程式碼取自一個已經使用多年、閉源了的系統。
float _x = abs(x - deviceInfo->position.x) / scale; int directionCode; if (0 < _x & x != deviceInfo->position.x) { if (0 > x - deviceInfo->position.x) { directionCode = 0x04 /*left*/; } else if (0 < x - deviceInfo->position.x) { directionCode = 0x02 /*right*/; } }
上面的程式碼等同於下面的程式碼,但是下面的程式碼可讀性更高。
static const int DIRECTIONCODE_RIGHT = 0x02; static const int DIRECTIONCODE_LEFT = 0x04; static const int DIRECTIONCODE_NONE = 0x00; int oldX = deviceInfo->position.x; int directionCode = (x > oldX) ? DIRECTIONCODE_RIGHT : (x > oldX) ? DIRECTIONCODE_LEFT : DIRECTIONCODE_NONE;
需要注意的是,註釋的越多並不意味著程式碼的理解性更強。當然在本案例中並沒有涉及到這一點。上面的註釋——如果你注意到的話——使得程式碼更加顯得凌亂不堪。有時候,註釋得越精簡程式碼的可讀性才越高。特別是在你必須更換使用其他符號名的情況下。
雖然我們能無限次地重構和精簡程式碼以避免寫繁冗的註釋,但是表述自己的思考過程的方式卻是有侷限性的。
無論最後你呈現的程式碼是有多麼的簡潔和清楚,程式碼也不可能完全自文件化。但是程式碼永遠也不可能取締註釋的存在。正如Jef Raskin所說:
[程式碼]無法解釋如此寫程式以及選擇該方法的原因。從[程式碼]上我們也看不出選擇某些替代方法的理由。例如:
/* A binary search turned out to be slower than the Boyer-Moore algorithm for the data sets of interest, thus we have used the more complex, but faster method even though this problem does not at first seem amenable to a string search technique. */
在A開發人員看來完全顯而易見的東西,可能在B眼裡完全就像霧裡看花一樣。所以我們在寫註釋的時候,也要考慮到這一點:
下面這個可能你一清二楚
$string = join('',reverse(split('',$string)));
反轉字串,但是要如何才能插入到
# Reverse the string
Perl檔案中呢?
的確,這一點都不難。歸根究底,程式碼只會告訴你程式是如何工作的,但是註釋則能說明工作的原因。所以,下次你寫程式碼的時候,不妨在這兩個方面給你的同事做個榜樣。
相關文章
- 程式碼是靈魂,註釋是心聲
- 流程是ERP的“靈魂”?(轉)
- 關於程式碼重構的靈魂三問:是什麼?為什麼?怎麼做?
- 註釋,今晚我不關心程式碼,我只想你
- 為什麼說程式碼註釋是程式設計師必備的技能?程式設計師
- 史上最無聊的程式設計師是怎樣註釋程式碼的程式設計師
- 企業資訊化的核心和靈魂是資訊資源管理
- 一文精通HashMap靈魂七問,你學還是不學HashMap
- CSS程式碼註釋CSS
- php程式碼註釋PHP
- JavaScript的註釋格式是什麼JavaScript
- 通過程式碼解釋什麼是API,什麼是SDK?API
- 靈魂拷問:flutter構建應用的方式是否是一種倒退?Flutter
- 《靈魂擺渡人》:解開心結的「死亡」關懷遊戲遊戲
- 有趣的程式碼註釋
- 請停止程式碼註釋
- javascript如何註釋程式碼JavaScript
- 來自靈魂的拷問——知道什麼是SQL執行計劃嗎?SQL
- 面試官靈魂三問:什麼是SOA?什麼是微服務?SOA和微服務有什麼區別?面試微服務
- Python多行註釋符號是什麼?Python符號
- 在 css 中什麼是好的註釋?CSS
- [吐槽貼,後刪]程式碼命名、註釋還是請稍微規範一丟丟吧
- 程式碼才是最好的註釋
- HTML 程式碼註釋規範HTML
- 註釋程式碼的13技巧
- Java程式碼註釋規範Java
- RabbitMQ靈魂拷問MQ
- 模式11:出租靈魂模式
- iOS 註釋方法大全 程式碼塊加快捷鍵註釋iOS
- vscode註釋快捷鍵是啥 vscode註釋快捷鍵設定VSCode
- 程式設計師是否有義務做好程式碼的註釋?你做好程式碼註釋了嗎?程式設計師
- Pycharm 程式碼註釋風格模板PyCharm
- jvm執行程式碼註釋部分JVM行程
- 工程師的靈魂工程師
- 什麼是虛榮心
- [每日一題]一道面試題是如何引發深層次的靈魂拷問?每日一題面試題
- iOS 註釋方法大全 程式碼塊加快捷鍵自定義註釋iOS
- 註釋 · 佛祖保佑程式碼永無BUG