文章閱讀-2周-What I learned from doing 1000 code reviews

What I learned from doing 1000 code reviews
文章作者從以往代碼審核的經驗角度提出三個建議

建議1诚隙、Throw an exception when things go wrong(當程序出現(xiàn)錯誤時宴霸,拋出一個異常)

例如代碼:

List<String> getSearchResults(...) {
  try {
    List<String> results = // make REST call to search service
    return results;
  } catch (RemoteInvocationException e) {
    return Collections.emptyList();
  }
}

核心內容:該建議主要討論在某些查詢功能中况增,當前程序發(fā)請求到后臺獲取數據時击碗,后臺跑出異常。
程序是返回一個空對象(null瓶竭、空集合等等)视乐,還是拋出異常?

場景1:查詢交易蔬墩,如果上游出現(xiàn)報錯译打,下游捕獲只返回空對象。
問題:前端只收到查詢成功拇颅,且收到空查詢結果奏司。導致監(jiān)控程序不能及時發(fā)現(xiàn)異常并及時修復問題。

場景2:從字符串解析出URL錯誤時樟插,直接返回null值韵洋。
問題:URL錯誤問題應該在上游程序修復,不能讓來下流程序進行處理黄锤。

最終結論:Empty objects are not the right tool for this job. If something is exceptional you should throw an exception(空對象不是一個正確方式針對這種情況搪缨。除非有例外清楚,不然就應該拋出一個異常)

個人觀點:個人從原則上比較贊同作者觀點鸵熟。有時候返回空對象副编,下游無法判斷具體沒有數據,還會異常流强。而且拋出異常我們盡量區(qū)分不同異常痹届。針對某一下流程序來說,捕獲到異常不一定意味程序就要中止煮盼,存在需要通過異常類型短纵,進行不同邏輯處理。

建議2僵控、Use the most specific type possible(盡可能使用最準確的類型)

作者舉例子:

void doOperation(String opType, Data data); 
// where opType is "insert", "append", or "delete", this should have clearly been an enum

String fetchWebsite(String url);
// where url is "https://google.com", this should have been an URN

String parseId(Input input);
// the return type is String but ids are actually Longs like "6345789"

核心內容:使用最準確的類型香到,這樣能夠避免一些BUG,且也是基于JAVA作為強類型語言的設計报破。
具體做法:
外部數據不為準確數據類型:
1悠就、在URLS的參數
2、JSON
3充易、數據庫不支持enums
4梗脾、寫得不好的庫

處理方式:

// Step 1: Take a query param representing a company name / member id pair and parse it
// example: context=Pair(linkedin,456)
Pair<String, Long> companyMember = parseQueryParam("context");
// this should throw an exception if malformed

// Step 2: Do all the stuff in your application
// MOST if not all of your code should live in this area

// Step 3: Convert the parameter back into a String at the very end if necessary
String redirectLink = serializeQueryParam("context");

步驟:
1、獲取查詢參數 公司名稱/成員ID 并解析它盹靴。如果數據錯誤則必須拋出異常炸茧。
2瑞妇、如果不是所有代碼都應該存在于此區(qū)域,請盡可能地完成應用程序中的所有操作
3梭冠、如果有必要辕狰,在最后時候把參數轉化為String

優(yōu)化:
1、錯誤數據會被發(fā)現(xiàn)
2控漠、如果出現(xiàn)問題蔓倍,程序較早失敗中止。
3盐捷、數據被驗證過一次偶翅,之后不需要在整個程序都保持捕獲解析錯誤。
4碉渡、更加準確訪問描述聚谁,對應方法的文檔內容也減少

個人觀點:這個在原來開發(fā)習慣中一直沒有注意這個問題。尤其屬于數據字典類型確實使用enums可以避免很多意外情況滞诺,就不用通過if或switch來單獨判斷垦巴,減少很多BUG。

建議3铭段、Use Optionals instead of nulls(使用空容器代表null值)

核心內容:用JAVA 8 提供的Optional來替換null,其中解決最多就是 Null Pointer Exception的問題
使用范圍建議:
1秦爆、當使用Optional時序愚,就不用考慮對象是否存在或合理默認值。而且隨時調用get()方法等限。
2爸吮、如果沒有合理默認值,使用map()和 .flatMap()方法望门,等后面再對對象賦值形娇。
3、如果有外部庫返回null表示空結果筹误,則利用Optional.ofNullable來分裝這個值桐早。null在程序里面造成影響會慢慢擴大,所以在源頭就解決這個問題厨剪。
4哄酝、使用Optional作為方法返回值,就不需要判斷什么時候返回值是不存在祷膳。

個人觀點:目前還是很少用JAVA 8的Optional對象陶衅,需要進一步學習。但是非常贊同作者這個建議直晨,null會導致很多NPE問題

建議4搀军、“Unlift” methods whenever possible(使用空容器代表null值)

需要避免方法如下

// AVOID:
CompletableFuture<T> method(CompletableFuture<S> param);
// PREFER: 
T method(S param);

// AVOID:
List<T> method(List<S> param);
// PREFER:
T method(S param);

// AVOID: 
T method(A param1, B param2, Optional<C> param3);
// PREFER:
T method(A param1, B param2, C param3);
T method(A param1, B param2);
// This method is clearly doing two things, it should be two methods
// The same is true for boolean parameters

這些需要避免方法有什么相同之處呢膨俐?
1、入參都是Optional, List, Task罩句。
2焚刺、返回參數也是同樣的集合(例如入參為Optional,返回參數為Optional)

理由:
方法1:Promise<A> method(Promise<B> param)
方法2:A method(B param)

理由如下:
1的止、例如當你只有B對象時候檩坚,只能調用方法2。
2诅福、方法2重寫使得更加靈活匾委、更加容易使用

個人觀點:目前還有無法參透這條建議。如果按照作者的建議氓润,對方法進行升級赂乐。但是如果過多使用泛型感覺方法的準確度就不高。目前還在理解中咖气。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末挨措,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崩溪,更是在濱河造成了極大的恐慌浅役,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伶唯,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞪讼,警方通過查閱死者的電腦和手機粹断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門瓶埋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悬赏,“玉大人,你說我怎么就攤上這事盾戴”啵” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵盆顾,是天一觀的道長畏梆。 經常有香客問我奠涌,道長,這世上最難降的妖魔是什么溜畅? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任慈格,我火速辦了婚禮,結果婚禮上浴捆,老公的妹妹穿的比我還像新娘。我一直安慰自己物邑,他們只是感情好滔金,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布餐茵。 她就那樣靜靜地躺著述吸,像睡著了一般蝌矛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隆豹,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天判哥,我揣著相機與錄音碉考,去河邊找鬼侯谁。 笑死锌仅,一個胖子當著我的面吹牛热芹,可吹牛的內容都是我干的。 我是一名探鬼主播嫩痰,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼串纺!你這毒婦竟也來了?” 一聲冷哼從身側響起纺棺,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榄笙,失蹤者是張志新(化名)和其女友劉穎祷蝌,沒想到半個月后茅撞,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡巨朦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了糊啡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚蓄。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡梭依,死狀恐怖役拴,靈堂內的尸體忽然破棺而出糊探,到底是詐尸還是另有隱情侧到,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布匠抗,位于F島的核電站故源,受9級特大地震影響,放射性物質發(fā)生泄漏汞贸。R本人自食惡果不足惜绳军,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矢腻。 院中可真熱鬧门驾,春花似錦、人聲如沸多柑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竣灌。三九已至聂沙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間初嘹,已是汗流浹背及汉。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屯烦,地道東北人坷随。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像驻龟,于是被迫代替她去往敵國和親温眉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,111評論 1 32
  • 國家電網公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數據交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,004評論 6 13
  • 一翁狐、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,748評論 0 10
  • 想到什么說什么吧芍殖,沒有提前構思~~~~四十分鐘前就想著要寫作業(yè)了,但是一想到今天的鄭多燕減肥操沒跳谴蔑,寫完在跳估計沒...
    中藝琴社白璐閱讀 257評論 0 0
  • 一 "好漂亮隐锭,轉個圈我看看。"閨蜜在一旁高興的說著计贰。 對于閨蜜的要求只好如實照辦钦睡,即興在鏡子前就轉了一圈。 看到鏡...
    沁木閱讀 607評論 11 10