青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Creative Commons License
本Blog采用 知識共享署名-非商業(yè)性使用-禁止演繹 3.0 Unported許可協(xié)議 進行許可。 —— Fox <游戲人生>

游戲人生

游戲人生 != ( 人生 == 游戲 )
站點遷移至:http://www.yulefox.com。請訂閱本博的朋友將RSS修改為http://feeds.feedburner.com/yulefox
posts - 62, comments - 508, trackbacks - 0, articles - 7

[譯]Google C++編程風格指南(六)

Posted on 2008-07-22 17:02 Fox 閱讀(3731) 評論(4)  編輯 收藏 引用 所屬分類: T技術碎語

原文地址:

  • 注釋

注釋雖然寫起來很痛苦,但對保證代碼可讀性至為重要,下面的規(guī)則描述了應該注釋什么、注釋在哪兒。當然也要記住,注釋的確很重要,但最好的代碼本身就是文檔(self-documenting),類型和變量命名意義明確要比通過注釋解釋模糊的命名好得多。

注釋是為別人(下一個需要理解你的代碼的人)而寫的,認真點吧,那下一個人可能就是你!

1. 注釋風格(Comment Style)

使用///* */,統(tǒng)一就好。

///* */都可以,//只是用的更加廣泛,在如何注釋和注釋風格上確保統(tǒng)一。

2. 文件注釋(File Comments)

在每一個文件開頭加入版權公告,然后是文件內容描述。

法律公告和作者信息

每一文件包含以下項,依次是:

1) 版權(copyright statement):如Copyright 2008 Google Inc.

2) 許可版本(license boilerplate):為項目選擇合適的許可證版本,如Apache 2.0BSDLGPLGPL

3) 作者(author line):標識文件的原始作者。

如果你對其他人創(chuàng)建的文件做了重大修改,將你的信息添加到作者信息里,這樣當其他人對該文件有疑問時可以知道該聯(lián)系誰。

文件內容

每一個文件版權許可及作者信息后,都要對文件內容進行注釋說明。

通常,.h文件要對所聲明的類的功能和用法作簡單說明,.cc文件包含了更多的實現(xiàn)細節(jié)或算法討論,如果你感覺這些實現(xiàn)細節(jié)或算法討論對于閱讀有幫助,可以把.cc中的注釋放到.h中,并在.cc中指出文檔在.h中。

不要單純在.h.cc間復制注釋,復制的注釋偏離了實際意義。

3. 類注釋(Class Comments)

每個類的定義要附著描述類的功能和用法的注釋。

// Iterates over the contents of a GargantuanTable.  Sample usage:
//    GargantuanTable_Iterator* iter = table->NewIterator();
//    for (iter->Seek("foo"); !iter->done(); iter->Next()) {
//      process(iter->key(), iter->value());
//    }
//    delete iter;
class GargantuanTable_Iterator {
  ...
};

如果你覺得已經(jīng)在文件頂部詳細描述了該類,想直接簡單的來上一句“完整描述見文件頂部”的話,還是多少在類中加點注釋吧。

如果類有任何同步前提(synchronization assumptions),文檔說明之。如果該類的實例可被多線程訪問,使用時務必注意文檔說明。

4. 函數(shù)注釋(Function Comments)

函數(shù)聲明處注釋描述函數(shù)功能,定義處描述函數(shù)實現(xiàn)。

函數(shù)聲明

注釋于聲明之前,描述函數(shù)功能及用法,注釋使用描述式("Opens the file")而非指令式("Open the file");注釋只是為了描述函數(shù)而不是告訴函數(shù)做什么。通常,注釋不會描述函數(shù)如何實現(xiàn),那是定義部分的事情。

函數(shù)聲明處注釋的內容:

1) inputs(輸入)outputs(輸出)

2) 對類成員函數(shù)而言:函數(shù)調用期間對象是否需要保持引用參數(shù),是否會釋放這些參數(shù);

3) 如果函數(shù)分配了空間,需要由調用者釋放;

4) 參數(shù)是否可以為NULL

5) 是否存在函數(shù)使用的性能隱憂(performance implications)

6) 如果函數(shù)是可重入的(re-entrant),其同步前提(synchronization assumptions)是什么?

舉例如下:

// Returns an iterator for this table.  It is the client's
// responsibility to delete the iterator when it is done with it,
// and it must not use the iterator once the GargantuanTable object
// on which the iterator was created has been deleted.
//
// The iterator is initially positioned at the beginning of the table.
//
// This method is equivalent to:
//    Iterator* iter = table->NewIterator();
//    iter->Seek("");
//    return iter;
// If you are going to immediately seek to another place in the
// returned iterator, it will be faster to use NewIterator()
// and avoid the extra seek.
Iterator* GetIterator() const;

但不要有無謂冗余或顯而易見的注釋,下面的注釋就沒有必要加上“returns false otherwise”,因為已經(jīng)暗含其中了:

// Returns true if the table cannot hold any more entries.
bool IsTableFull();

注釋構造/析構函數(shù)時,記住,讀代碼的人知道構造/析構函數(shù)是什么,所以“destroys this object”這樣的注釋是沒有意義的。說明構造函數(shù)對參數(shù)做了什么(例如,是否是指針的所有者)以及析構函數(shù)清理了什么,如果都是無關緊要的內容,直接省掉注釋,析構函數(shù)前沒有注釋是很正常的。

函數(shù)定義

每個函數(shù)定義時要以注釋說明函數(shù)功能和實現(xiàn)要點,如使用的漂亮代碼、實現(xiàn)的簡要步驟、如此實現(xiàn)的理由、為什么前半部分要加鎖而后半部分不需要。

不要從.h文件或其他地方的函數(shù)聲明處直接復制注釋,簡要說明函數(shù)功能是可以的,但重點要放在如何實現(xiàn)上。

5. 變量注釋(Variable Comments)

通常變量名本身足以很好說明變量用途,特定情況下,需要額外注釋說明。

類數(shù)據(jù)成員

每個類數(shù)據(jù)成員(也叫實例變量或成員變量)應注釋說明用途,如果變量可以接受NULL或-1等警戒值(sentinel values),須說明之,如:

private:
 // Keeps track of the total number of entries in the table.
 // Used to ensure we do not go over the limit. -1 means
 // that we don't yet know how many entries the table has.
 int num_total_entries_;

全局變量(常量)

和數(shù)據(jù)成員相似,所有全局變量(常量)也應注釋說明含義及用途,如:

// The total number of tests cases that we run through in this regression test.
const int kNumTestCases = 6;

6. 實現(xiàn)注釋(Implementation Comments)

對于實現(xiàn)代碼中巧妙的、晦澀的、有趣的、重要的地方加以注釋。

代碼前注釋

出彩的或復雜的代碼塊前要加注釋,如:

// Divide result by two, taking into account that x
// contains the carry from the add.
for (int i = 0; i < result->size(); i++) {
  x = (x << 8) + (*result)[i];
  (*result)[i] = x >> 1;
  x &= 1;
}

行注釋

比較隱晦的地方要在行尾加入注釋,可以在代碼之后空兩格加行尾注釋,如:

// If we have enough memory, mmap the data portion too.
mmap_budget = max<int64>(0, mmap_budget - index_->length());
if (mmap_budget >= data_size_ && !MmapData(mmap_chunk_bytes, mlock))
  return;  // Error already logged.

注意,有兩塊注釋描述這段代碼,當函數(shù)返回時注釋提及錯誤已經(jīng)被記入日志。

前后相鄰幾行都有注釋,可以適當調整使之可讀性更好:

...
DoSomething();                  // Comment here so the comments line up.
DoSomethingElseThatIsLonger();  // Comment here so there are two spaces between
                                // the code and the comment.
...

NULL、true/false、1、2、3……

向函數(shù)傳入、布爾值或整數(shù)時,要注釋說明含義,或使用常量讓代碼望文知意,比較一下:

bool success = CalculateSomething(interesting_value,
                                  10,
                                  false,
                                  NULL);  // What are these arguments??

和:

bool success = CalculateSomething(interesting_value,
                                  10,     // Default base value.
                                  false,  // Not the first time we're calling this.
                                  NULL);  // No callback.

使用常量或描述性變量:

const int kDefaultBaseValue = 10;
const bool kFirstTimeCalling = false;
Callback *null_callback = NULL;
bool success = CalculateSomething(interesting_value,
                                  kDefaultBaseValue,
                                  kFirstTimeCalling,
                                  null_callback);

不要

注意永遠不要用自然語言翻譯代碼作為注釋,要假設讀你代碼的人C++比你強:D:

// Now go through the b array and make sure that if i occurs,
// the next element is i+1.
...        // Geez.  What a useless comment.

7. 標點、拼寫和語法(Punctuation, Spelling and Grammar)

留意標點、拼寫和語法,寫的好的注釋比差的要易讀的多。

注釋一般是包含適當大寫和句點(.)的完整的句子,短一點的注釋(如代碼行尾的注釋)可以隨意點,依然要注意風格的一致性。完整的句子可讀性更好,也可以說明該注釋是完整的而不是一點不成熟的想法。

雖然被別人指出該用分號(semicolon)的時候用了逗號(comma)有點尷尬。清晰易讀的代碼還是很重要的,適當?shù)臉它c、拼寫和語法對此會有所幫助。

8. TODO注釋(TODO Comments)

對那些臨時的、短期的解決方案,或已經(jīng)夠好但并不完美的代碼使用TODO注釋。

這樣的注釋要使用全大寫的字符串TODO,后面括號(parentheses)里加上你的大名、郵件地址等,還可以加上冒號(colon):目的是可以根據(jù)統(tǒng)一的TODO格式進行查找:

// TODO(kl@gmail.com): Use a "*" here for concatenation operator.
// TODO(Zeke) change this to use relations.

如果加上是為了在“將來某一天做某事”,可以加上一個特定的時間("Fix by November 2005")或事件("Remove this code when all clients can handle XML responses.")。

______________________________________

譯者:注釋也是比較人性化的約定了:

1. 關于注釋風格,很多C++的coders更喜歡行注釋,C coders或許對塊注釋依然情有獨鐘,或者在文件頭大段大段的注釋時使用塊注釋;

2. 文件注釋可以炫耀你的成就,也是為了捅了簍子別人可以找你;

3. 注釋要言簡意賅,不要拖沓冗余,復雜的東西簡單化和簡單的東西復雜化都是要被鄙視的;

4. 對于Chinese coders來說,用英文注釋還是用中文注釋,it is a problem,但不管怎樣,注釋是為了讓別人看懂,難道是為了炫耀編程語言之外的你的母語或外語水平嗎;

5. 注釋不要太亂,適當?shù)目s進才會讓人樂意看,但也沒有必要規(guī)定注釋從第幾列開始(我自己寫代碼的時候總喜歡這樣),UNIX/LINUX下還可以約定是使用tab還是space,個人傾向于space;

6. TODO很不錯,有時候,注釋確實是為了標記一些未完成的或完成的不盡如人意的地方,這樣一搜索,就知道還有哪些活要干,日志都省了。

Feedback

# re: [譯]Google C++編程風格指南(六)  回復  更多評論   

2011-07-22 14:04 by air jordan 9
函數(shù)注釋有點難懂...

# re: [譯]Google C++編程風格指南(六)  回復  更多評論   

2011-08-01 17:09 by replica Rolex watches
C++ 木有學過

# re: [譯]Google C++編程風格指南(六)  回復  更多評論   

2011-08-09 21:16 by timberland boots
注意永遠不要用自然語言翻譯代碼作為注釋

# re: 重寫atoi函數(shù)  回復  更多評論   

2011-10-11 11:33 by north face jackets
According to labor negotiations in New York sports reporter Adrian Yahoo site - Werner Pavlovsky said the two sides have not agreed next time for negotiations, which is the second encounter Stern term shrinking of the season.
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            蜜臀久久99精品久久久画质超高清| 欧美一级免费视频| 这里只有精品电影| 亚洲视频精品在线| 女人香蕉久久**毛片精品| 免费日韩成人| 欧美激情欧美激情在线五月| 亚洲国产精品va在看黑人| 亚洲夫妻自拍| 一区二区激情视频| 欧美淫片网站| 欧美精品二区三区四区免费看视频| 欧美日韩国产综合网 | 欧美电影免费观看| 欧美色图首页| 伊人春色精品| 一区二区三区精品国产| 亚洲国产一区二区三区a毛片 | 欧美激情一二区| 欧美日韩在线三区| 激情欧美亚洲| 一区二区欧美在线观看| 欧美在线免费观看| 亚洲国产欧美一区二区三区同亚洲| 亚洲精品永久免费| 欧美一级大片在线免费观看| 欧美成人午夜激情视频| 国产农村妇女毛片精品久久莱园子 | 亚洲国产女人aaa毛片在线| 99在线热播精品免费99热| 久久精品视频va| 99精品国产在热久久下载| 久久久久久自在自线| 国产精品国产a级| 亚洲人午夜精品免费| 久久精品一区四区| 亚洲一区中文| 欧美日韩情趣电影| 亚洲人午夜精品| 欧美日韩精品久久| 亚洲综合丁香| 久久激情综合| 欧美午夜不卡在线观看免费| 国产精品视频福利| 亚洲高清中文字幕| 亚洲欧美精品一区| 亚洲国产精品久久久久婷婷884| 亚洲自拍16p| 欧美视频二区| 一本大道久久a久久精二百| 亚洲天堂av图片| 麻豆精品精华液| 先锋影音国产精品| 国产精品国产三级国产专区53| 亚洲欧洲精品一区二区| 欧美二区不卡| 欧美成ee人免费视频| 亚洲国产日韩欧美一区二区三区| 久久久久国内| 久久精品国产久精国产爱| 国产精品入口| 欧美在线欧美在线| 欧美一区二区国产| 国语自产精品视频在线看一大j8 | 午夜精品美女自拍福到在线| 99在线精品视频| 欧美性猛交视频| 亚洲欧美日韩精品久久奇米色影视 | 欧美色区777第一页| 国产一区二区三区四区老人| 午夜精品成人在线视频| 夜夜嗨av一区二区三区免费区| 欧美精品一区二区三区在线播放 | 久久精品国产第一区二区三区| 亚洲香蕉成视频在线观看| 国产精品免费福利| 欧美在线视频一区| 久久人人爽爽爽人久久久| 亚洲国产欧美不卡在线观看 | 欧美激情在线有限公司| 欧美成人dvd在线视频| av成人国产| 亚洲欧美日韩国产一区| 国内精品一区二区| 亚洲精品资源美女情侣酒店| 欧美久久一区| 欧美亚洲视频在线观看| 性欧美精品高清| 91久久精品国产91性色| 亚洲精品一区二区三区蜜桃久| 国产精品久在线观看| 久久免费的精品国产v∧| 久久在线视频| 午夜视频一区二区| 美日韩精品免费观看视频| 在线视频中文亚洲| 久久久99国产精品免费| 亚洲一区二区免费看| 久久精选视频| 亚洲欧美国产毛片在线| 久久福利电影| 亚洲免费一在线| 免费在线国产精品| 欧美一区二区三区视频免费| 蜜臀va亚洲va欧美va天堂| 亚洲欧美日韩国产成人| 美女脱光内衣内裤视频久久影院| 亚洲免费在线视频| 麻豆成人综合网| 久久成人免费视频| 欧美日韩在线第一页| 欧美电影资源| 狠狠入ady亚洲精品经典电影| 亚洲人成7777| 亚洲国产精品悠悠久久琪琪| 欧美一级久久久| 午夜久久福利| 欧美人成在线| 亚洲国产婷婷香蕉久久久久久99| 国模大胆一区二区三区| 亚洲女性喷水在线观看一区| 一区二区不卡在线视频 午夜欧美不卡'| 久久久精彩视频| 亚洲欧美日韩另类| 欧美日韩中文字幕在线视频| 91久久久精品| 最新成人av网站| 美女啪啪无遮挡免费久久网站| 久久亚洲视频| 黄色小说综合网站| 久久久91精品国产一区二区三区 | 亚洲国产日韩欧美综合久久 | 欧美亚一区二区| 亚洲精品久久久久久一区二区| 亚洲电影免费观看高清完整版| 久久精品一区蜜桃臀影院| 久久久爽爽爽美女图片| 国产有码一区二区| 久久国产精品色婷婷| 久久久美女艺术照精彩视频福利播放| 国产日产亚洲精品| 欧美一二区视频| 久久蜜桃资源一区二区老牛 | 亚洲国产中文字幕在线观看| 国产精品一级| 亚洲欧洲99久久| 国产精品乱人伦中文| 99天天综合性| 亚洲欧美视频一区二区三区| 国产精品一区免费观看| 欧美一级淫片aaaaaaa视频| 久久久欧美精品sm网站| 在线免费观看视频一区| 蜜桃av综合| 日韩视频在线一区二区| 午夜精品婷婷| 在线观看视频亚洲| 欧美日韩国产影院| 亚洲午夜一区二区三区| 久久综合网络一区二区| 亚洲精品韩国| 国产精品美女一区二区在线观看| 午夜精品一区二区三区在线视| 久久久免费精品| av不卡在线| 国产一区二区三区四区五区美女 | 猫咪成人在线观看| av成人免费观看| 久久永久免费| 妖精视频成人观看www| 国产精品欧美风情| 牛夜精品久久久久久久99黑人 | 美女尤物久久精品| 一区二区激情小说| 美女精品一区| 亚洲一区二区三区国产| 国产一区视频在线看| 欧美日韩亚洲一区二区三区| 欧美在线视频观看| 亚洲色无码播放| 亚洲国产婷婷香蕉久久久久久99| 欧美在线观看一区二区三区| 亚洲裸体俱乐部裸体舞表演av| 国产偷久久久精品专区| 欧美日韩激情小视频| 老色批av在线精品| 羞羞答答国产精品www一本 | 一区二区三区国产精品| 伊人色综合久久天天| 国产精品毛片| 欧美日韩一二三区| 欧美插天视频在线播放| 久久精品国产亚洲精品| 亚洲色图在线视频| 日韩一级在线观看| 亚洲电影免费观看高清完整版在线观看| 欧美一区二区国产| 这里只有精品丝袜| 亚洲乱码国产乱码精品精98午夜| 韩日成人av|