欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

代碼中到底應(yīng)不應(yīng)當(dāng)寫注釋?

 更新時間:2014年10月08日 09:18:01   投稿:hebedich  
注釋的確有其用途,但大部分情況下,程序員在濫用注釋。我是反對夾雜在代碼間的注釋的,我認為注釋應(yīng)當(dāng)從代碼中獨立出來——通常被稱為文檔。

當(dāng)很多前輩教育后輩應(yīng)當(dāng)多寫注釋的時候,當(dāng)網(wǎng)絡(luò)上充滿了有關(guān)程序員從不寫注釋的段子的時候,這是一個非常有爭議的話題。作為一個標(biāo)題黨,容我先修正一下我的觀點:我認為如果代碼寫得足夠好,那么大多數(shù)注釋是多余的,我們應(yīng)該通過寫出更好的代碼來代替更多注釋。

注釋的確有其用途,但大部分情況下,程序員在濫用注釋。我是反對夾雜在代碼間的注釋的,我認為注釋應(yīng)當(dāng)從代碼中獨立出來——通常被稱為文檔。

請看下面一段代碼。

復(fù)制代碼 代碼如下:

/* /static/market/checkout.js

2014.7.2 create by orzfly
2014.7.29 update by jysperm: fixbugs

TODO: 這段代碼中注釋太多了,需要移除一些 -- jysperm
*/

var raw_products = req.query['products'].split(',');

// 商品 ID 的數(shù)組
var products = []

// 過濾每個參數(shù)
for(var i = 0, i < raw_products.length, i++) {
    if (!raw_products[i])
        return;

    // 前端傳來的數(shù)據(jù)中居然會有空格
    if (!raw_products[i].trim())
        return

    /* 2014.7.22: 現(xiàn)在可以使用非數(shù)字 ID 了
    // 略過非數(shù)字條目
    if (isNan(raw_products[i].trim().toFixed()))
        return;
    */

    products.push(raw_products[i].trim().toFixed());
}

// 總錢數(shù)
var sum = 0;

// 計算每個商品的總錢數(shù)
for(var i = 0, i < products.length, i++) {
    // 從數(shù)據(jù)庫中查商品信息
    var data = db.product.byID(products[i]);

    // TODO: 誰來寫一下沒查到商品的情況

    // 把商品的價格加到總錢數(shù)上, a += b 是 a = a + b 的縮寫
    sum += data.price;
}

你居然花了一半的時間在讀注釋上面,這是多么浪費生命的事情,在代碼中每加一行注釋,都會增加代碼的閱讀成本——即使閱讀者已經(jīng)了解了注釋所要傳達的精神;同時也會增加維護成本:修改這段代碼的人不得不連同注釋一起修改——而且你不能確定他到底會不會這么做。

所以只有當(dāng)非常必要的情況下,才應(yīng)該添加注釋,而且應(yīng)當(dāng)言簡意賅。注釋不應(yīng)當(dāng)解釋一段代碼在做什么,因為這是每個合格的程序員都應(yīng)該知道的事情,而是應(yīng)該解釋這段代碼為什么要這樣做。

由此引出幾種明顯不應(yīng)該添加的注釋:

本應(yīng)由版本控制系統(tǒng)記錄的信息、對代碼的評論,以及不是很重要的 TODO.

代碼并不是全部,一個但凡靠譜一點的項目,都應(yīng)當(dāng)有自己的版本控制系統(tǒng),除了記錄代碼差異之外,還應(yīng)該有工單和 Issue 的功能。
閱讀代碼的人通常不需要了解幾個程序員之間的恩怨,很多時候也不關(guān)心這段代碼的歷史,這些信息只會把代碼拖得越來越長。

廢棄的代碼

被棄用的代碼應(yīng)該被刪掉,這些代碼會非常影響閱讀,而且它們一般又很長。
在絕大多數(shù)情況下,被棄用的代碼不會重新派上用場,即使出現(xiàn)了少數(shù)情況,你也可以從版本控制系統(tǒng)中找到它們。

對變量和函數(shù)名的解釋

這種情況下顯然你需要一個更恰當(dāng)?shù)拿郑绻@個標(biāo)識符有一個比較小的作用于,你可以使用一個比較長的名字以便容納更多信息。

例如上文中的:

products 應(yīng)改為 products_id
sum 應(yīng)改為 total_amount
data 應(yīng)改為 product_record
對語法的解釋,以及顯而易見的事情

例如上文中的「把商品的價格加到總錢數(shù)上, a += b 是 a = a + b 的縮寫」,這顯然是任何一個人都知道的事情。

也許有人愿意通過寫這樣的注釋來梳理思路:

復(fù)制代碼 代碼如下:

// 過濾參數(shù):
//    去掉 ID 里的空格
//    去掉非數(shù)字 ID
// 循環(huán)每一個商品:
//    去數(shù)據(jù)庫查記錄
//    把商品的價格加到總錢數(shù)上

但是當(dāng)代碼寫完的時候記得刪掉。

對邏輯塊的概括

例如上文中的「過濾每個參數(shù)」和「計算每個商品的總錢數(shù)」,這情況下通常是你沒有對邏輯進行抽象,具體表現(xiàn)就是像下面這樣:

復(fù)制代碼 代碼如下:

// 首先有 25 行代碼去做事情 A
// 然后有 5 行代碼去做事情 B
// 這里有 90 行代碼去做事情 C
// 最后有 45 行代碼去做事情 D

這導(dǎo)致你需要一些注釋來分割這四個部分。如果這四個部分都是一個函數(shù)調(diào)用的話,那么函數(shù)名本身就是對邏輯的一種解釋,讀者可以快速地找到函數(shù) B, 而不必在前 25 行中搜索做事情 B 的五行代碼。

綜上,我對這段代碼的改善意見如下:

復(fù)制代碼 代碼如下:

var filterProductID = function(raw_products_id) {
    result = []

    raw_products_id.forEach(function(product_id) {
        if (product_id and product_id.trim())
            products_id.push(product_id.trim().toFixed());
    });

    return result;
};

var getPriceOfProduct = function(id) {
    var product_record = db.product.byID(products[i]);

    if (product_record)
        return product_record.price;
    else
        return 0;
};

var products_id = filterProductID(req.query['products'].split(','));
var tatol_amount = 0;

products_id.forEach(function(product_id) {
    tatol_amount += getPriceOfProduct(product_id);
});

雖然我在以一段虛構(gòu)的,刻意編造的代碼來佐證我的觀點,但我相信在實際的項目中,同樣可以通過改善代碼來減少注釋,而且總體上來講會節(jié)約更多的時間和精力。

相關(guān)文章

  • 用戶權(quán)限管理設(shè)計[圖文說明]

    用戶權(quán)限管理設(shè)計[圖文說明]

    用戶管理權(quán)限設(shè)計一直是大家討論的熱點,因為幾乎涉及到每一個開發(fā)的業(yè)務(wù)系統(tǒng)。我找了很多很多的資料,大家的核心基本上都是一樣的:基于角色管理. 用戶,角色,模塊,權(quán)限的相互組合,就可以形成一個強大的權(quán)限管理系統(tǒng)。
    2008-12-12
  • Vertica集成Apache Hudi重磅使用指南

    Vertica集成Apache Hudi重磅使用指南

    這篇文章主要為大家介紹了Vertica集成Apache Hudi的重磅使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • 獲取目錄下所有文件名的代碼

    獲取目錄下所有文件名的代碼

    獲取目錄下所有文件名的代碼,需要的朋友可以參考下。
    2011-07-07
  • JetBrains(IEDA、CLion、Pycharm) 學(xué)生獲得免費使用資格

    JetBrains(IEDA、CLion、Pycharm) 學(xué)生獲得免費使用資格

    JetBrains針對學(xué)生推出了免費使用資格,但是很多同學(xué)卻不知道或者說不知道怎樣獲得免費資格,通過學(xué)生認證來使用JetBrains的軟件才是最方便穩(wěn)定的,具體怎么獲取呢,感興趣的朋友跟隨小編一起看看吧
    2020-08-08
  • 微信支付 :curl出錯,錯誤碼:60兩個問題的解決

    微信支付 :curl出錯,錯誤碼:60兩個問題的解決

    這篇文章主要介紹了微信支付 出錯的解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Wordpress 忘記密碼的處理方法

    Wordpress 忘記密碼的處理方法

    有時候不小心忘了wordpress的密碼了,大家可以按照下面的方法試試。
    2009-05-05
  • 在github上怎樣修改語言設(shè)置

    在github上怎樣修改語言設(shè)置

    這篇文章主要介紹了在github上怎樣修改語言設(shè)置問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • json顯示日期帶T問題的解決方法

    json顯示日期帶T問題的解決方法

    使用json顯示日期時,細心的朋友會發(fā)現(xiàn)帶T字母,就是天數(shù)跟小時數(shù)之間出現(xiàn)了一個T,下面為大家介紹下具體的解決方法
    2013-10-10
  • TCP關(guān)閉問題詳細介紹

    TCP關(guān)閉問題詳細介紹

    這篇文章主要介紹了TCP關(guān)閉問題詳細介紹的相關(guān)資料, TCP的三次握手,四次揮手,需要的朋友可以參考下
    2017-04-04
  • IDEA中使用Git拉取代碼時報 Git pull failed原因及解決方法

    IDEA中使用Git拉取代碼時報 Git pull failed原因及解決方法

    這篇文章主要介紹了IDEA中使用Git拉取代碼時報 Git pull failed原因及解決方法,本文給大家介紹的非常詳細對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論