亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

如何在JavaScript中謹慎使用代碼注釋

2024-05-06 16:52:35
字體:
來源:轉載
供稿:網友

前言

最令程序員頭痛的事情莫過于閱讀別人的代碼,但其實時間一久閱讀自己的代碼也會很痛苦。 問題不是出在『自己或別人』,而是在代碼本身。

必要的注釋可以闡明實現細節和設計意圖,以此節約自己和別人的時間。 然而很多時候注釋起的作用卻適得其反,比如自動生成的過多的注釋分散閱讀者的注意力, 而過期的失效的注釋更是誤導閱讀者。

自動生成的注釋

代碼注釋的泛濫想必是從Eclipse,Visual Studio等IDE開始的。 這些IDE提供了很多快捷功能,生成類/接口的骨架,具有Getter/Setter的屬性等等。 如果用過IDE,下面的代碼你一定不會陌生:

/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub}

上述6行代碼中的4行注釋包含的信息量是0,既沒有闡釋參數args是何物,也沒有說明main的用途。 然而大量的項目中都充斥著這樣的自動生成注釋。

『建議』:如果有參數或機制需要說明,請補充這些信息。否則請刪除自動生成注釋。 當然,用于生成文檔的注釋除外。

過多的注釋

總會有人不厭其煩地編寫長篇累牘的注釋,或無微不至,或語焉不詳,或晦澀難懂,或文采飛揚。 總之沒有幫助我更快閱讀代碼的注釋都是失敗的注釋。

為了說明問題,Harttle克隆了4.x Linux Kernel源碼, 來大致分析一下其注釋行數。 我們知道內核代碼95%以上是C語言,所以統計.c文件就足夠說明問題了。

? linux git:(master) git clone git@github.com:torvalds/linux.git --depth=1? linux git:(master) find . -name "*.c" -o -name "*.h" -exec grep -E '^/s*((/*)|(/[/*]))' {} /; | wc -l724804? linux git:(master) find . -name "*.c" -o -name "*.h" -exec cat {} /; | wc -l4018961? linux git:(master) node> 724804/(4018961-724804)0.22002715717556875

內核倉庫中的代碼大概是402萬行(未移除空行),其中注釋72萬行,占比22%。 Linux內核使用低級的C語言編寫,涉及到復雜的CPU調度、內存管理,驅動程序。 因此注釋會偏多一些,一般的項目注釋應小于這個數值。

『建議』:如果你的代碼中注釋超過了20%,那么顯然你過度注釋了。

文件頭注釋

很多編輯器/IDE都會生成默認的文件頭,例如:

/*** @file /tmp/xxx.js* @author harttle(yangjvn@126.com)* @date 2016-08-30 22:33* @description A XXX Implementation for XXX.*/

文件頭注釋清晰地列出了文件的作者、功能描述等信息,看起來很有用。 不過這樣的文件頭存在的問題在于其維護性:

  • 其他人做小的修改時未必會修改@author,甚至連@author都不知道現在該文件已經面目全非。
  • 每次移動該文件,是否還需要花功夫更新 @file 信息?
  • 誰會在每次代碼修改后記得更新 @description,于是@description也總是誤導讀者

文件頭注釋意在維護代碼文件的元信息,以便在分發和部署過程中維護作者版權等信息。 然而在擁有版本控制的代碼倉庫中,這些信息不再需要手動維護,甚至可以通過git blame查看每一行代碼的作者和時間信息。

『建議』:使用版本控制工具,刪除文件頭注釋。版權信息可在構建或分發時生成。

冗余的注釋

意圖非常清楚的代碼原則上不需要注釋,多余的注釋反而會造成維護性問題。 尤其是非英語母語的作者常常會掉到這個坑里。比如變量和函數的注釋:

/** 獲取用戶數目*/function getUserCount(){// 用戶的列表var userList = [];}

這不是廢話么!冗余的注釋問題仍然在于維護性,例如調整函數功能、調整參數順序, 或者更換變量名時我們不得不更新這些注釋。否則這些注釋就會誤導下一個讀者。

【建議】:不說廢話。

抽取注釋到標識符

可能讀者也會有這樣的經驗:當我們寫了一大段代碼時,往往需要把它們分為幾塊。 然后在每一塊開頭添加一段注釋。例如:

function calcTotalCharge(movies, user){// Calculate Movie Chargevar movieCharge = 0;for(var i=0; i<movies.length; i++){var charge = 0;if(movie.type === 'discount'){charge = movie.charge * 0.8;}else if(movie.type === 'short'){charge = movie.charge * 2;}else if(movie.type === 'normal'){charge = movie.charge;}movieCharge += charge;}// Calculate User Chargevar rentCharge = 0;if(user.isVIP1){rentCharge = 10;}if(user.isVIP2){rentCharge = 200;}else if(user.isVIP3){rentCharge = 300;}else if(user.isVIP4){rentCharge = 500;}// Calculate Total Chargereturn movieCharge + rentCharge;}

上述代碼中的三段注釋確實加速了閱讀代碼的速度, 但每當代碼需要注釋才能讀懂時就應該警醒:是不是結構設計有問題。 對于上述代碼,我們可以通過更加可復用的結構來消除注釋:

function calcTotalCharge(movies, user){return calcMovieCharge(movies) + calcUserCharge(user);}function calcMovieCharge(movies){var total = 0;for(var i=0; i<movies.length; i++){total += calcSingleMovieCharge(movie);}return total;}function calcSingleMovieCharge(movie){if(movie.type === 'discount') return movie.charge * 0.8;else if(movie.type === 'short') return movie.charge * 2;else if(movie.type === 'normal') return movie.charge;return 0;}function calcUserCharge(user){if(user.isVIP1) return 10;else if(user.isVIP2) return 200;else if(user.isVIP3) return 300;else if(user.isVIP4) return 500;return 0;}

代碼重構之后原來的注釋就變得毫無意義,代碼意圖都被清晰的表述在標識符的命名中。 通常重構會帶來代碼量的減小,因為封裝了分支、每個單元的邏輯也更加明確。

【建議】:當我們發現不得不進行注釋時,需要警醒是否結構設計發生了問題。

有用的注釋

至此Harttle已描述了這么多反模式,并非為了說明代碼注釋不重要。 而是為了說明『代碼注釋存在的意義在于幫助理解代碼本身』。 例如在編寫一些Trick,Polyfill,臨時代碼,以及復雜算法時,注釋變得相當重要。 例如:

  • Tricks and Polyfills。有時簡單的Trick就可解決多數問題問題, 為沒必要編寫復雜的普適算法, 例如檢測瀏覽器的DOM API支持,檢測AMD/CommonJS環境等等。 這時我們需要清晰地說明這些Trick的意圖,甚至可以將這些代碼抽離為polyfill模塊。
  • 復雜算法。有時我們會編寫數學性非常強的算法,一眼望去不知所云。 在開始這些算法前清晰地說明其意圖何在,讀者也就不必花大功夫讀懂這些數學了。
  • 公有接口。模塊的對外接口從邏輯上定義了模塊類型,公有接口代碼也更容易被人讀到。 尤其是JavaScript接口:如果不注釋options中到底是什么,誰曉得接口如何使用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲国产精品| 亚洲精品99久久久久中文字幕| 日韩精品亚洲精品| 国产日韩在线播放| 欧美亚洲成人免费| 2018中文字幕一区二区三区| 国产一区二区三区在线看| 国语自产精品视频在免费| 久久青草福利网站| 国内精久久久久久久久久人| 欧美国产日韩视频| 成人a在线视频| 国产欧美日韩综合精品| 在线播放国产精品| 亚洲国产一区二区三区在线观看| 91久久久精品| 午夜欧美不卡精品aaaaa| 久久999免费视频| 国产精品日韩在线播放| 亚洲偷熟乱区亚洲香蕉av| 97免费中文视频在线观看| 精品色蜜蜜精品视频在线观看| 成人激情视频免费在线| 国产情人节一区| 亚洲石原莉奈一区二区在线观看| xvideos亚洲人网站| 97热在线精品视频在线观看| 欧美日韩亚洲91| 国产精品亚洲第一区| 亚洲欧美一区二区三区情侣bbw| 国产精品福利小视频| 国产成人av网| 亚洲精品ady| 国产成人亚洲精品| 久久99国产综合精品女同| 亚洲综合中文字幕在线观看| 久久人人爽亚洲精品天堂| 久久福利视频网| 久久久久久这里只有精品| 国内精品小视频| 亚洲国产日韩精品在线| 国产亚洲日本欧美韩国| 26uuu另类亚洲欧美日本一| 欧美老少配视频| 亚洲毛片一区二区| 精品久久久91| 国产成人av在线| 国产成人亚洲综合青青| 亚洲欧美999| 不卡伊人av在线播放| 57pao成人永久免费视频| 成人黄色影片在线| 欧美xxxx做受欧美| 亚洲欧美国产精品久久久久久久| 九色精品美女在线| 欧美国产激情18| 一本色道久久综合狠狠躁篇怎么玩| 久久久久久久久久久av| 亚洲女人被黑人巨大进入al| 精品久久久久久| 久久在线观看视频| 91精品国产乱码久久久久久久久| 久久精品国产v日韩v亚洲| 日韩成人网免费视频| 国产精品美女久久久久av超清| 亚洲tv在线观看| 78m国产成人精品视频| 亚洲bt天天射| 国产欧亚日韩视频| 欧美成人免费全部观看天天性色| 成人精品视频久久久久| 亚洲视频国产视频| 国产日韩在线看| 国产v综合ⅴ日韩v欧美大片| 九九精品在线播放| 4438全国成人免费| 91国产高清在线| 国产一区二区香蕉| 日韩成人在线视频网站| 欧美精品手机在线| 亚洲成人a级网| 国产成人一区二| 综合激情国产一区| 人九九综合九九宗合| 68精品久久久久久欧美| 国产自产女人91一区在线观看| 人人爽久久涩噜噜噜网站| 欧美一区二区三区免费视| 91最新国产视频| 91久久精品视频| 亚洲成人黄色在线观看| 久久久久久久999| 亚洲精品电影在线| 中文字幕久热精品在线视频| 日韩中文有码在线视频| 成人黄色片网站| 欧美日韩国产精品一区| 欧美在线免费观看| 国内精品国产三级国产在线专| 成人美女免费网站视频| 欧美华人在线视频| 欧美性猛交99久久久久99按摩| 国产一区二区三区视频在线观看| 亚洲一区二区久久久| 欧美日韩不卡合集视频| 欧美午夜久久久| 国产91久久婷婷一区二区| 久久免费少妇高潮久久精品99| 亚洲国产私拍精品国模在线观看| 欧美高清视频在线| 91亚洲国产成人久久精品网站| 久久久久中文字幕| 亚洲午夜色婷婷在线| 日本伊人精品一区二区三区介绍| 国产精品影院在线观看| 中文字幕精品av| 欧美在线视频播放| 亚洲国产天堂网精品网站| 国产成人精品日本亚洲| 亚洲国产成人91精品| 亚洲国产私拍精品国模在线观看| 情事1991在线| 黑人巨大精品欧美一区二区三区| 91黑丝在线观看| 日韩在线免费视频观看| 精品国产1区2区| 最新亚洲国产精品| 国产欧美在线视频| 日韩国产一区三区| 久久精品一偷一偷国产| 亚洲在线一区二区| 精品久久久免费| 国产婷婷成人久久av免费高清| 欧美高清激情视频| 91精品视频大全| 国产婷婷成人久久av免费高清| 日韩欧美综合在线视频| 一区二区三区视频免费在线观看| 亚洲黄一区二区| 国产精品网站视频| 欧美电影免费观看电视剧大全| 欧亚精品在线观看| 久久免费成人精品视频| 精品爽片免费看久久| 精品国产91乱高清在线观看| 在线免费看av不卡| 欧美丰满少妇xxxx| 欧美理论在线观看| 永久555www成人免费| 欧美国产日韩一区二区在线观看| 亚洲精品自在久久| 黑人巨大精品欧美一区二区| 欧美国产日韩免费| 亚洲va欧美va国产综合久久| 国产成人精品电影久久久| 中文字幕av日韩| 成人在线精品视频| 欧美黑人狂野猛交老妇| 日韩福利伦理影院免费| 亚洲天堂一区二区三区| 奇门遁甲1982国语版免费观看高清| 欧美洲成人男女午夜视频| 91精品国产综合久久香蕉的用户体验| 国产精品男人的天堂|