《The historical Inputs_and_Outputs compulsive item(avoid non-const reference) changed》

出參一定要是指針?

image.png

群里之前有同學問過這個問題。
當時的規(guī)范中著拭,強制了這一條,因為彼時的規(guī)范該條目主要來自Google C++ Style Guide其中一個歷史版本牍帚,比較舊了儡遮,當時google還未更新此項。

這個條目是影響面比較大的爭議項暗赶。有不少人反饋鄙币,之前我寫了個issue(https://git.code.oa.com/standards/cpp/issues/71 )提議修改。
經過和委員們的思考和互動討論蹂随,這個條目已經如提議改進了十嘿。
可以看到,現(xiàn)在的規(guī)范(https://git.code.oa.com/standards/cpp#51%E6%8E%A8%E8%8D%90%E8%BE%93%E5%85%A5%E5%92%8C%E8%BE%93%E5%87%BA
中岳锁, 這個條目已不再強制绩衷。

對我們的影響(僅有積極影響)是:存量代碼中這一條目對應的CodeCC告警(Is this a non-const reference? If so, make const or use a pointer)不用改。

該記錄歸檔于此,以后編程可以注意一下咳燕。


issue引文:

這個強制條目可能需要改進一下

image.png

圖中這項是一個影響非常大的爭議項勿决,問題在于強制。

:) 可能條目比較多招盲,大家沒太注意這項低缩。
這個條目的邏輯稍微有點牽強,說了不少引用的優(yōu)點曹货,但是轉而說不讓用引用咆繁,理由是為了可讀性。

再論可讀性

這個條目成立基于這樣一個前提:“相比引用控乾,指針具有更高可讀性”么介。
但是,這個斷言并不成立蜕衡。

所謂優(yōu)勢

猜想到的,可能體現(xiàn)可讀性優(yōu)勢的设拟,是這種場景:

callee:
void copy1(const std::string& a, std::string* b);
void copy2(const std::string& a, std::string& b);
caller:
copy1(foo, &bar);
copy2(foo, bar);

然而慨仿,不少情況調用處是指針變量,不是一個變量實例前加&求址纳胧,這個所謂的優(yōu)勢蕩然無存镰吆。

caller:
ptr_bar = &bar;
copy1(foo, ptr_bar); // 直接傳指針變量

輸入的已經用const修飾了,沒用const修飾的引用很顯然就是輸出參數(shù)跑慕,指針并沒有比引用更顯式地表達輸出万皿。如此,指針作為出參并沒有可讀性優(yōu)勢核行。

即使退一步牢硅,假設這樣的寫法是存在優(yōu)勢的,這樣的場景也有很大的局限性芝雪。

因為會直接'&'這樣寫的减余,只是caller,更確切地說惩系,是初始caller位岔,所以,在一個調用鏈中堡牡,只有在最初的caller中才能體現(xiàn)這個假設的優(yōu)勢抒抬。

語義需要明確,而不是基于隱喻

怎么表達一個參數(shù)晤柄,是類型系統(tǒng)擦剑;用一個參數(shù)具體做什么,是具體的邏輯,這是獨立的兩件事抓于,一件事不該隱喻另一件事做粤。

可能可讀性最好不要通過取址符這一層隱喻來實現(xiàn)。若論可讀性捉撮,自然語言的可讀性最佳怕品,它可以表現(xiàn)在:

  1. IN/OUT這樣的自然語言增強修飾。(windows以前的用法巾遭。我們可能不用宏肉康,更不會用這么短的宏)。
  2. 顯式的關鍵字灼舍。(比如RUST的mut吼和,表示mutable,C#的out骑素,表示output)
  3. 變量名炫乓。(這里對應形參的取名,直接self-documenting為出參)
  4. 注釋献丑。(如果3仍未滿足)

畢竟末捣,最終caller還是必然得看callee原型的。:) 應該不會有caller不看原型创橄,直接因為有個&箩做,就認為是輸出了吧。

引用比指針具有更高的可讀性

我們的程序有兩種reference妥畏,一種是const的邦邦,一種不是。

引用的語義比指針更加明確醉蚁,在這種非此即彼的場景中更是如此燃辖。

Modern C++中開發(fā)者更愿意把pointer看做nullable reference,而不是把reference看成const-initialized pointer馍管。
引用的本質是常量指針郭赐,用意就是作為變量的別名。這樣用目標變量別名即為出參确沸,語義上也更自然捌锭。

返回值的本質

函數(shù)返回值的本質訴求在于:有一個容器,能容納需要的輸出信息罗捎,caller可以access這個容器观谦。
當你選用函數(shù)出參實現(xiàn)函數(shù)返回值時,這也便成了函數(shù)出參的訴求桨菜。

如果你使用指針豁状,它將是一個不確定的值捉偏,具有不明確的語義。
如果我不希望它為null泻红,那么我為什么總是需要假定它為null呢夭禽?這給開發(fā)者非常高的心智負擔。

若旨在可讀性谊路,那么讹躯,應該直接用Modern C++的返回方式。

強制的影響大

可行性上缠劝,眾多項目底層接口(包括基礎庫的接口)本就是用引用的潮梯,如果強制不能用,這些功能是必然實現(xiàn)不了的惨恭。
成本上秉馏,即使可行,修改成本也過高了脱羡。這是未來成本萝究。

如果強制,可能經過大幅度修改滿足規(guī)范了轻黑,但是未來的一天糊肤,修改了此項。如果要通過檢查氓鄙,可能又得改回來。這是潛在的沉沒成本业舍。

綜上抖拦,未來成本、潛在的沉沒成本很高舷暮。規(guī)范中這一條目改進之后态罪,這些成本可以減少。

該條目的提出者下面,也已經改正了此條目

google minds think alike复颈,谷歌已經改正了這一項

具體commit:
https://github.com/google/styleguide/commit/7a7a2f510efe7d7fc5ea8fbed549ddb31fac8f3e

https://google.github.io/styleguide/cppguide.html#Inputs_and_Outputs

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末沥割,一起剝皮案震驚了整個濱河市耗啦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌机杜,老刑警劉巖帜讲,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異椒拗,居然都是意外死亡似将,警方通過查閱死者的電腦和手機获黔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來在验,“玉大人玷氏,你說我怎么就攤上這事∫干啵” “怎么了盏触?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侦厚。 經常有香客問我耻陕,道長,這世上最難降的妖魔是什么刨沦? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任诗宣,我火速辦了婚禮,結果婚禮上想诅,老公的妹妹穿的比我還像新娘召庞。我一直安慰自己,他們只是感情好来破,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布篮灼。 她就那樣靜靜地躺著,像睡著了一般徘禁。 火紅的嫁衣襯著肌膚如雪诅诱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天送朱,我揣著相機與錄音娘荡,去河邊找鬼。 笑死驶沼,一個胖子當著我的面吹牛炮沐,可吹牛的內容都是我干的。 我是一名探鬼主播回怜,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼大年,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了玉雾?” 一聲冷哼從身側響起翔试,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抹凳,沒想到半個月后遏餐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赢底,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年失都,在試婚紗的時候發(fā)現(xiàn)自己被綠了柏蘑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡粹庞,死狀恐怖咳焚,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情庞溜,我是刑警寧澤革半,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站流码,受9級特大地震影響又官,放射性物質發(fā)生泄漏。R本人自食惡果不足惜漫试,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一六敬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驾荣,春花似錦外构、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歧匈,卻和暖如春垒酬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背件炉。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工伤溉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妻率。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像板祝,于是被迫代替她去往敵國和親宫静。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容