成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

<<編寫(xiě)可維護(hù)的javascript>> 筆記2(注釋)

renweihub / 802人閱讀

摘要:注釋是代碼中最常見(jiàn)的組成部分它們是另一種形式的文檔也是程序員最后才舍得花時(shí)間去寫(xiě)的但是對(duì)于代碼的總體可維護(hù)性而言注釋是非常重要的一環(huán)打開(kāi)一個(gè)沒(méi)有任何注釋的文件就好像趣味冒險(xiǎn)但如果給你的時(shí)間有限這項(xiàng)任務(wù)就變成了折磨適度的添加注釋可以解釋說(shuō)明代

注釋是代碼中最常見(jiàn)的組成部分.它們是另一種形式的文檔,也是程序員最后才舍得花時(shí)間去寫(xiě)的.但是,對(duì)于代碼的總體可維護(hù)性而言,注釋是非常重要的一環(huán).打開(kāi)一個(gè)沒(méi)有任何注釋的文件就好像趣味冒險(xiǎn),但如果給你的時(shí)間有限,這項(xiàng)任務(wù)就變成了折磨.適度的添加注釋可以解釋說(shuō)明代碼的來(lái)龍去脈,其他開(kāi)發(fā)者就可以不用從頭開(kāi)始閱讀代碼,而是直接去讀代碼的任意部分.編程風(fēng)格通常不會(huì)包含對(duì)注釋的風(fēng)格約定,但我任務(wù)從注釋的作用即可看出它們的重要性不容忽視.

js支持兩種不同類(lèi)型的注釋: 單行注釋和多行注釋.

2.1 單行注釋
單行注釋有三種使用方法:

獨(dú)占一行的注釋,用來(lái)解釋下一行代碼.這行注釋之前總是有一個(gè)空行,且縮進(jìn)層級(jí)和下級(jí)代碼保持一致.

在代碼行的尾部的注釋.代碼結(jié)束到注釋之間至少有一個(gè)縮進(jìn).注釋(包括之前的代碼部分)不應(yīng)當(dāng)超過(guò)單行最大字符數(shù)限制,如果超過(guò)了,就將這條注釋放置于當(dāng)前代碼行的上方.

被注釋掉的大段代碼(很多編輯器都可以批量注釋掉多行代碼).

單行注釋不應(yīng)當(dāng)以連續(xù)多行注釋的形式出現(xiàn),除非你注釋掉一大段代碼.只有當(dāng)需要注釋一段很長(zhǎng)的文本是才使用多行注釋.

// 好的寫(xiě)法
if(condition){
    
    // 如果代碼執(zhí)行到這里,則表明通過(guò)了所有安全性檢查
    allowed();
}

// 不好的寫(xiě)法
if(condition){
    // 如果代碼執(zhí)行到這里,則表明通過(guò)了所有安全性檢查
    allowed();
}

// 不好的寫(xiě)法: 錯(cuò)誤的縮進(jìn)
if(condition){
// 如果代碼執(zhí)行到這里,則表明通過(guò)了所有安全性檢查
    allowed();
}

// 好的寫(xiě)法
var result = something + somethingElse; // somethingElse不應(yīng)當(dāng)取值為null

// 不好的寫(xiě)法: 代碼和注釋之間沒(méi)有間隔
var result = something + somethingElse;// somethingElse不應(yīng)當(dāng)取值為null

// 好的寫(xiě)法
// if(condition) {
//    doSomething();
//    thenDoSomethingElse();
// }

// 不好的寫(xiě)法
// 接下來(lái)這段代碼非常難, 那么, 讓我詳細(xì)解釋一下
// 這段代碼的作用是首先判斷天劍是否為真
// 只有為真時(shí)才會(huì)執(zhí)行, 這里的條件是通過(guò)
// 多個(gè)函數(shù)計(jì)算出來(lái)的, 在整個(gè)回話生命周期內(nèi)
// 整個(gè)值是可以被修改的
if(condition) {
    
    // 如果代碼執(zhí)行到這里, 則表明通過(guò)了所有安全性檢查
    allowed();
}

2.2 多行注釋

// 合法的多行注釋
/* 我的注釋 */
/* 另一段注釋
這段注釋包含兩行*/
/*
又是一段注釋
這段注釋同樣包含兩行
*/

//逼格高,更加清晰.java風(fēng)格注釋
/*
 * 另一段注釋
 * 這段注釋包含兩行文本
 */

多行注釋總是會(huì)出現(xiàn)在將要描述的代碼段之前, 注釋和代碼之間沒(méi)有空行間隔. 和單行注釋一樣, 多行注釋之前應(yīng)當(dāng)有一個(gè)空行, 且縮進(jìn)層級(jí)和其描述的代碼保持一致.

// 好的寫(xiě)法
if(condition){
    
    /*
     * 如果代碼段執(zhí)行到這里
     * 說(shuō)明通過(guò)了所有的安全性檢測(cè)
     */
    allowed();
}

// 不好的寫(xiě)法: 注釋之前無(wú)空行
if(condition){
    /*
     * 如果代碼段執(zhí)行到這里
     * 說(shuō)明通過(guò)了所有的安全性檢測(cè)
     */
    allowed();
}

// 不好的寫(xiě)法: 星號(hào)后沒(méi)有空格
if(condition){
    /*
     *如果代碼段執(zhí)行到這里
     *說(shuō)明通過(guò)了所有的安全性檢測(cè)
     */
    allowed();
}

// 不好的寫(xiě)法: 錯(cuò)誤的縮進(jìn)
if(condition){

/*
 * 如果代碼段執(zhí)行到這里
 * 說(shuō)明通過(guò)了所有的安全性檢測(cè)
 */
    allowed();
}

// 不好的寫(xiě)法: 代碼尾部注釋不要用多行注釋格式
var result = something + somethingElse; /*somethingElse 不應(yīng)當(dāng)取值為null*/

2.3 使用注釋
通行的指導(dǎo)原則是:當(dāng)代碼不夠清晰時(shí)添加注釋, 當(dāng)代碼很明了時(shí)不應(yīng)該添加注釋.

2.3.1 難于理解的代碼
難于理解的代碼通常都應(yīng)該添加注釋. 根據(jù)代碼的用途, 你可以用單行注釋, 多行注釋, 或是混合兩種注釋. 關(guān)鍵是讓其他人更容易讀懂這段代碼. 比如, 這段實(shí)例代碼摘自YUI類(lèi)庫(kù)中的Y.mix()方法.

// 好的寫(xiě)法
if(mode) {

    /*
     * 當(dāng)mode為2時(shí)(原型到原型, 對(duì)象到對(duì)象), 這里只遞歸執(zhí)行一次
     * 用來(lái)執(zhí)行原型到原型的合并操作, 對(duì)象到對(duì)象的合并操作 
     * 將會(huì)被掛起, 在合適的時(shí)機(jī)執(zhí)行
     */
    if(mode === 2) {
        Y.mix(receiver.prototype, supplier.prototype, overwrite,
                whitelist, 0, merge);
    }
    
    /*
     * 根據(jù)指定的模式類(lèi)型, 我們可能會(huì)從元對(duì)象拷貝至原型中,
     * 或是從原型拷貝至接受對(duì)象中
     */
    from = mode === 1 || mode === 3 ? supplier.prototype : supplier;
    to = mode === 1 || mode === 4 ? receiver.prototype : receiver;
    
    /*
     * 如果supplier或receiver不含有原型屬性時(shí),
     * 則邏輯結(jié)束, 并返回undefined, 如果有原型屬性,
     * 則邏輯結(jié)束并返回received
     */
    if(!from || !to) {
        return receiver;
    }
}else {
    from = supplier;
    to = receiver;
}

Y.mix()方法使用常量來(lái)決定如何處理. mode參數(shù)就是常量之一, 但僅僅通過(guò)這些數(shù)值無(wú)法解釋他們各自代表的含義. 這里的注釋非常棒, 因?yàn)樗皶r(shí)地解釋了這里負(fù)責(zé)的決策邏輯.

2.3.2 可能被誤認(rèn)為錯(cuò)誤的代碼
另一個(gè)適合添加注釋的好時(shí)機(jī)是當(dāng)代碼看上去有錯(cuò)誤時(shí). 在團(tuán)隊(duì)開(kāi)發(fā)中, 總是會(huì)有一些好心的開(kāi)發(fā)者在編輯代碼時(shí)發(fā)現(xiàn)他人的代碼錯(cuò)誤, 就立即修復(fù). 有時(shí)這段代碼并不是錯(cuò)誤的源頭, 所以"修復(fù)"這個(gè)錯(cuò)誤往往會(huì)制造其他的錯(cuò)誤, 因此本次修改應(yīng)當(dāng)是可追蹤的. 當(dāng)你寫(xiě)的代碼有可能會(huì)被別的開(kāi)發(fā)者任務(wù)是有錯(cuò)誤時(shí), 則需要添加注釋.

while(element && (element = element[axis])) {
    if((all || element[]TAG_NAME) &&
            (!fn || fn(elemtnt))) {
        return element;
    }
}

這個(gè)例子中, 開(kāi)發(fā)者在while循環(huán)控制條件中使用了一個(gè)賦值運(yùn)算符. 這不是一種標(biāo)準(zhǔn)用法, 并常常被檢測(cè)工具認(rèn)為是有問(wèn)題的. 如果你對(duì)這段代碼不熟悉, 讀到這段沒(méi)有注釋的代碼時(shí), 很有可能誤認(rèn)為這是一個(gè)錯(cuò)誤, 猜想作者的本意是使用比較運(yùn)算符==而不是賦值運(yùn)算符=. 這行末尾的注釋說(shuō)明作者是有意為之, 即賦值而非比較. 這樣, 其他開(kāi)發(fā)者讀到這段代碼時(shí)就不會(huì)將它"修復(fù)".

2.3.3 瀏覽器特性hack
js程序員常常會(huì)編寫(xiě)一些低效的、不雅的、徹頭徹尾的臟代碼, 用來(lái)讓低級(jí)瀏覽器正常工作. 實(shí)際上這種情形是一種特殊的"可能被誤認(rèn)為錯(cuò)誤的代碼": 這種不明顯的做瀏覽器特性Hack的代碼可能隱含一些錯(cuò)誤. 例子, 摘自YUI類(lèi)庫(kù)的Y.DOM.contains()方法.

var ret = false;

if(!needle || !element || !needle[NODE_TYPE] || !element[NODE_TYPE]) {
    ret = false;
}else if(element[CONTAINS]) {
    
    //如果needle不是ELEMENT_NODE時(shí), ie和safari下面會(huì)有錯(cuò)誤
    if(Y.UA.opera || needle[NODE_TYPE] === 1) {
        ret = element[CONTAINS](needle);
    }else {
        ret = Y_DOM._bruteContains(element, needle);
    }
}else if(element[COMPARE_DOCUMENT_POSITION]) {
    if(element === needle ||
            !!(element[COMPARE_DOCUMENT_POSITION](needle) & 16)){
        ret = true;
    }
}

return ret;

這段代碼第7行包含一條很重要的注釋. 盡管IE和Safari中都有內(nèi)置方法contains(), 但如果needle不是一個(gè)元素時(shí), 這個(gè)方法會(huì)報(bào)錯(cuò). 所以只有當(dāng)瀏覽器是Opera時(shí)才能用這個(gè)方法, 其他瀏覽器中needle必須是一個(gè)元素(nodeType是1). 這里關(guān)于瀏覽器的說(shuō)明同樣解釋了為什么需要一個(gè)if語(yǔ)句, 這個(gè)注釋不僅確保將來(lái)不會(huì)被他人誤改動(dòng), 而且在代碼編寫(xiě)者回頭閱讀自己這段代碼時(shí), 也會(huì)適當(dāng)?shù)尼槍?duì)新版本的IE和Safari的兼容情況作出調(diào)整.

2.4 文檔注釋
文檔注釋并不是js的組成部分, 但是應(yīng)用很廣泛. 最流行的格式是JavaDoc文檔格式: 多行注釋以單斜線加雙星號(hào)(/**)開(kāi)始, 接下來(lái)是描述信息, 其中使用@符號(hào)來(lái)表示一個(gè)或多個(gè)屬性.

/**
如果需要深拷貝(deep copy), 請(qǐng)使用"clone()"
@method merge
@param {Object} 被合并的一個(gè)或多個(gè)對(duì)象
@return {Object} 一個(gè)新的合并后的對(duì)象
**/
Y.merge = function() {
    var args = arguments,
        i = 0,
        len = args.length,
        result = {};
        
    for(; i < len; ++i) {
        Y.mix(result, args[i], true);
    }
    
    return result;
}

所有的方法

應(yīng)當(dāng)對(duì)方法、期望的參數(shù)和可能返回的值添加注釋描述.

所有的構(gòu)造函數(shù)

應(yīng)當(dāng)對(duì)自定義類(lèi)型和期望的參數(shù)添加注釋描述.

所有包含文檔化方法的對(duì)象

如果一個(gè)對(duì)象包含一個(gè)或多個(gè)附帶文檔注釋的方法, 那么這個(gè)對(duì)象也應(yīng)當(dāng)適當(dāng)?shù)蒯槍?duì)文檔生成工具添加文檔注釋

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87318.html

相關(guān)文章

  • &lt;&lt;編寫(xiě)維護(hù)javascript&gt;&gt; 筆記3(語(yǔ)句和表達(dá)式)

    摘要:所有的塊語(yǔ)句都應(yīng)當(dāng)使用花括號(hào)包括花括號(hào)的對(duì)齊方式第一種風(fēng)格第二種風(fēng)格塊語(yǔ)句間隔第一種在語(yǔ)句名圓括號(hào)和左花括號(hào)之間沒(méi)有空格間隔第二種在左圓括號(hào)之前和右圓括號(hào)之后各添加一個(gè)空格第三種在左圓括號(hào)后和右圓括號(hào)前各添加一個(gè)空格我個(gè)人喜歡在右括號(hào)之后添 所有的塊語(yǔ)句都應(yīng)當(dāng)使用花括號(hào), 包括: if for while do...while... try...catch...finally 3....

    OBKoro1 評(píng)論0 收藏0
  • &lt;&lt;編寫(xiě)維護(hù)javascript&gt;&gt; 筆記1(基本格式化)

    摘要:程序是寫(xiě)給人讀的只是偶爾讓計(jì)算機(jī)執(zhí)行一下當(dāng)你剛剛組建一個(gè)團(tuán)隊(duì)時(shí)團(tuán)隊(duì)中的每個(gè)人都各自有一套編程習(xí)慣畢竟每個(gè)成員都有著不同的背景有些人可能來(lái)自某個(gè)皮包公司身兼數(shù)職在公司里面什么事都做還有些人會(huì)來(lái)自不同的團(tuán)隊(duì)對(duì)某種特定的做事風(fēng)格情有獨(dú)鐘或恨之入骨 程序是寫(xiě)給人讀的,只是偶爾讓計(jì)算機(jī)執(zhí)行一下. Donald Knuth 當(dāng)你剛剛組建一個(gè)團(tuán)隊(duì)時(shí),團(tuán)隊(duì)中的每個(gè)人都各自有一套編程習(xí)慣.畢竟,...

    wfc_666 評(píng)論0 收藏0
  • &lt;&lt;編寫(xiě)維護(hù)javascript&gt;&gt; 筆記9(將配置數(shù)據(jù)從代碼中分離出來(lái)

    摘要:代碼無(wú)非是定義一些指令的集合讓計(jì)算機(jī)來(lái)執(zhí)行我們常常將數(shù)據(jù)傳入計(jì)算機(jī)由指令對(duì)數(shù)據(jù)進(jìn)行操作并最終產(chǎn)生一個(gè)結(jié)果當(dāng)不得不修改數(shù)據(jù)時(shí)問(wèn)題就來(lái)了任何時(shí)候你修改源代碼都會(huì)有引入的風(fēng)險(xiǎn)且值修改一些數(shù)據(jù)的值也會(huì)帶來(lái)一些不必要的風(fēng)險(xiǎn)因?yàn)閿?shù)據(jù)時(shí)不應(yīng)當(dāng)影響指令的正 代碼無(wú)非是定義一些指令的集合讓計(jì)算機(jī)來(lái)執(zhí)行. 我們常常將數(shù)據(jù)傳入計(jì)算機(jī), 由指令對(duì)數(shù)據(jù)進(jìn)行操作, 并最終產(chǎn)生一個(gè)結(jié)果. 當(dāng)不得不修改數(shù)據(jù)時(shí)問(wèn)題就來(lái)...

    xbynet 評(píng)論0 收藏0
  • &lt;&lt;編寫(xiě)維護(hù)javascript&gt;&gt; 筆記5(UI層松耦合)

    摘要:由于第四章太稀松平常了于是就直接跳到第五章了這里我就草草的說(shuō)一下第四章的幾個(gè)點(diǎn)吧在嚴(yán)格模式的應(yīng)用下不推薦將用在全局作用域中相等推薦盡量使用和守則如果是在沒(méi)有別的方法來(lái)完成當(dāng)前任務(wù)這時(shí)可以使用原始包裝類(lèi)型不推薦創(chuàng)建類(lèi)型時(shí)用等創(chuàng)建類(lèi)型從這一章節(jié) 由于第四章太稀松平常了, 于是就直接跳到第五章了.這里我就草草的說(shuō)一下第四章的幾個(gè)點(diǎn)吧 在嚴(yán)格模式的應(yīng)用下 不推薦將use strict;用在全...

    saucxs 評(píng)論0 收藏0
  • &lt;&lt;編寫(xiě)維護(hù)javascript&gt;&gt; 筆記7(事件處理)

    摘要:在所有應(yīng)用中事件處理都是非常重要的所有的均通過(guò)事件綁定到上所以大多數(shù)前端工程師需要花費(fèi)很多時(shí)間來(lái)編寫(xiě)和修改事件處理程序遺憾的是在誕生之初這部分內(nèi)容并未受太多重視甚至當(dāng)開(kāi)發(fā)者們開(kāi)始熱衷于將傳統(tǒng)的軟件架構(gòu)概念融入到里時(shí)事件綁定仍然沒(méi)有收到多大重 在所有JavaScript應(yīng)用中事件處理都是非常重要的. 所有的JavaScript均通過(guò)事件綁定到UI上, 所以大多數(shù)前端工程師需要花費(fèi)很多時(shí)間...

    microelec 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

renweihub

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<