最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在JavaScript中謹(jǐn)慎使用代碼注釋

 更新時間:2019年06月21日 16:30:46   作者:Harttle  
這篇文章主要介紹了如何在JavaScript中謹(jǐn)慎使用代碼注釋,必要的注釋可以闡明實現(xiàn)細(xì)節(jié)和設(shè)計意圖,以此節(jié)約自己和別人的時間。 然而很多時候注釋起的作用卻適得其反,,需要的朋友可以參考下

前言

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

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

自動生成的注釋

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

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

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

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

過多的注釋

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

為了說明問題,Harttle克隆了4.x Linux Kernel源碼, 來大致分析一下其注釋行數(shù)。 我們知道內(nèi)核代碼95%以上是C語言,所以統(tǒng)計.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 -l
724804
➜ linux git:(master) find . -name "*.c" -o -name "*.h" -exec cat {} \; | wc -l
4018961
➜ linux git:(master) node
> 724804/(4018961-724804)
0.22002715717556875

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

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

文件頭注釋

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

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

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

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

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

『建議』:使用版本控制工具,刪除文件頭注釋。版權(quán)信息可在構(gòu)建或分發(fā)時生成。

冗余的注釋

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

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

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

【建議】:不說廢話。

抽取注釋到標(biāo)識符

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

function calcTotalCharge(movies, user){
// Calculate Movie Charge
var 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 Charge
var 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 Charge
return movieCharge + rentCharge;
}

上述代碼中的三段注釋確實加速了閱讀代碼的速度, 但每當(dāng)代碼需要注釋才能讀懂時就應(yīng)該警醒:是不是結(jié)構(gòu)設(shè)計有問題。 對于上述代碼,我們可以通過更加可復(fù)用的結(jié)構(gòu)來消除注釋:

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;
}

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

【建議】:當(dāng)我們發(fā)現(xiàn)不得不進(jìn)行注釋時,需要警醒是否結(jié)構(gòu)設(shè)計發(fā)生了問題。

有用的注釋

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • bootstrap datepicker 與bootstrapValidator同時使用時選擇日期后無法正常觸發(fā)校驗的解決思路

    bootstrap datepicker 與bootstrapValidator同時使用時選擇日期后無法正常觸發(fā)校驗的解

    這篇文章主要介紹了bootstrap datepicker 與bootstrapValidator同時使用時選擇日期后無法正常觸發(fā)校驗的解決思路的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • JavaScript中實現(xiàn)最高效的數(shù)組亂序方法

    JavaScript中實現(xiàn)最高效的數(shù)組亂序方法

    這篇文章主要介紹了JavaScript中實現(xiàn)最高效的數(shù)組亂序方法,數(shù)組亂序的意思是,把數(shù)組內(nèi)的所有元素排列順序打亂,需要的朋友可以參考下
    2014-10-10
  • php 中序列化和json使用介紹

    php 中序列化和json使用介紹

    序列化是將對象狀態(tài)轉(zhuǎn)換為可保持或可傳輸?shù)母袷降倪^程。與序列化相對的是反序列化,它將流轉(zhuǎn)換為對象。這兩個過程結(jié)合起來,可以輕松地存儲和傳輸數(shù)據(jù)
    2013-07-07
  • js實現(xiàn)手機拍照上傳功能

    js實現(xiàn)手機拍照上傳功能

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)手機拍照上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • js模糊查詢實例分享

    js模糊查詢實例分享

    本文主要分享了js模糊查詢的實現(xiàn)代碼,沒有接觸到后臺數(shù)據(jù)的知識,只是查詢當(dāng)前表格中每一行所包含的關(guān)鍵字。具有一定的參考價值,需要的朋友一起來看下吧
    2016-12-12
  • JavaScript實現(xiàn)顯示隱藏表單文字

    JavaScript實現(xiàn)顯示隱藏表單文字

    這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)顯示隱藏表單文字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 前端必須掌握的五種常用排序算法總結(jié)大全

    前端必須掌握的五種常用排序算法總結(jié)大全

    前端開發(fā)中掌握排序算法對于數(shù)據(jù)處理至關(guān)重要,本文介紹五種基本排序算法,冒泡排序、選擇排序、插入排序、快速排序和歸并排序,幫助開發(fā)者選擇合適的方法優(yōu)化性能,需要的朋友可以參考下
    2024-10-10
  • JS實現(xiàn)簡易換圖時鐘功能分析

    JS實現(xiàn)簡易換圖時鐘功能分析

    這篇文章主要介紹了JS實現(xiàn)簡易換圖時鐘功能,結(jié)合實例形式分析了javascript結(jié)合時間函數(shù)定時變換顯示圖片實現(xiàn)時鐘功能的相關(guān)操作技巧,代碼中備有較為詳盡的注釋便于理解,需要的朋友可以參考下
    2018-01-01
  • 前端vue完全銷毀一個組件的簡單步驟

    前端vue完全銷毀一個組件的簡單步驟

    組件銷毀有很多種情況比如頁面關(guān)閉,路由跳轉(zhuǎn)(沒有使用keep-alive時的路由切換),這篇文章主要介紹了前端vue完全銷毀一個組件的簡單步驟,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2025-04-04
  • JS中動態(tài)創(chuàng)建元素的三種方法總結(jié)(推薦)

    JS中動態(tài)創(chuàng)建元素的三種方法總結(jié)(推薦)

    下面小編就為大家?guī)硪黄狫S中動態(tài)創(chuàng)建元素的三種方法總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10

最新評論

将乐县| 全州县| 卫辉市| 吉林市| 东至县| 界首市| 辽中县| 临西县| 宝山区| 扶沟县| 腾冲县| 中方县| 柳江县| 桦甸市| 固安县| 永宁县| 九龙县| 太仆寺旗| 铜陵市| 浦东新区| 南开区| 密云县| 疏附县| 美姑县| 通榆县| 都兰县| 仙游县| 和政县| 莎车县| 万载县| 赣榆县| 霞浦县| 龙陵县| 庄河市| 潼南县| 册亨县| 东光县| 武隆县| 凤庆县| 乐都县| 将乐县|