程序員寫出這樣的代碼,能不捱罵嗎?

當你換槽填坑時,面對一個新的環境。能夠快速熟練,上手實現業務需求是關鍵。


但是,哪些因素會影響你快速上手呢?是原有代碼寫的不夠好?還是註釋寫的不夠好?


昨夜,閒情雅緻,瞅了瞅隔壁小王的代碼,看完之後真是太上火,氣不打一處來。


於是,把小王犯的錯誤拉了個清單,一起幫他改進一下,順便看看這些壞習慣,你是否也有呢?


1.

過度相信別人,會給自己挖坑。


針對接口輸入參數,沒有進行嚴格校驗,尤其是要插入數據庫庫的參數,一路透傳到底(數據庫層面),數據庫就報數據插入異常。


對於調用者而言,會一直等待接口響應,而最後拿到數據庫錯誤,會一臉懵 B;對於接口本身而言,會佔用數據庫連接,損耗資源,如果併發量大的情況,影響可想而知。


建議:業務代碼研發過程中,不要相信調用者會按照要求傳參數,要做到防禦性編程。


2.

異常捉都捉啦,就差一哆嗦。


2.1. 抓住了異常,卻什麼都沒做!


程序員寫出這樣的代碼,能不捱罵嗎?


2.2. 打印異常棧的方式,卻顯得毫無意義。


程序員寫出這樣的代碼,能不捱罵嗎?


估計很多人,都會這麼寫,但是在生產上,卻顯得意義不大,所以最好用記錄日誌的形式輸出異常信息。


建議:業務代碼研發過程中,針對接口中發生的異常,既然進行了 catch,那就一定要好好封裝處理,若不做任何處理,私自把異常給吞沒了,一旦線上出了問題,卻不知道問題出在了哪裡。


3.

小兒科的問題,會大意失荊州。


3.1. 代碼這麼寫,還談什麼用戶體驗?


例如,用戶綁定銀行卡場景,判斷銀行卡是否已經綁定,未綁定則進行綁定。


程序員寫出這樣的代碼,能不捱罵嗎?


循環遍歷用戶綁定的銀行卡列表,然後比較傳入的卡號(cardNo)是否已經綁定過,當傳入的卡號與綁定的卡號一致時,修改 hasCard 為 true,並沒有跳出循環,繼續下一次比較判斷。


那麼,如果類似這種代碼,發生在數據量比較大的場景下,勢必會降低性能,過度浪費資源,用戶肯定會罵街。


建議修改方式(仁者見仁智者見智):


程序員寫出這樣的代碼,能不捱罵嗎?


3.2. 數據挨個去處理,怎麼還出現了漏網之魚?


例如,三方數據對賬時,判斷三方傳過來的數據在本地狀態是否正常匹配,把沒匹配的數據進行註銷處理。

程序員寫出這樣的代碼,能不捱罵嗎?

代碼這麼寫,一旦條件匹配,進行刪除某條記錄後,list 的大小發生了變化,而 i 的值也在變化,就會導致在遍歷的時候,漏掉某些記錄。


比如,當刪除第 1 個元素後,繼續根據索引訪問第 2 個元素時,因為刪除的關係,後面的元素都往前移動了一位,所以實際訪問的是第 3 個元素。


建議採用 Iterator 刪除,或者集合倒序遍歷刪除。

程序員寫出這樣的代碼,能不捱罵嗎?

3.3. & 與 && 的使用不當,終釀錯。


例如,在 Web 項目中,判斷輸入的郵箱是否為空。


程序員寫出這樣的代碼,能不捱罵嗎?

當 email 輸入為 null 時,& 使用時,後面的條件會發生空指針異常。


建議修改為:


程序員寫出這樣的代碼,能不捱罵嗎?


同樣,| 與 || 也有類似的情況,所以在使用時,也要注意此類場景的問題。


3.4. equals 比較,搞不好會出么蛾子。


程序員寫出這樣的代碼,能不捱罵嗎?


當 resMap.get(Global.RETCODE) 為 null 時,會發生空指針異常。


鑑於 Object 的 equals 方法容易拋空指針異常,所以業務研發中,應使用常量或確定有值的對象來調用 equals。


建議修改為:


程序員寫出這樣的代碼,能不捱罵嗎?


3.5. 數學運算,搞不好會傾家蕩產。


程序員寫出這樣的代碼,能不捱罵嗎?


輸出結果:0.010000000000005116,一般遇到需要用到浮點數運算的地方,都可以使用 java.math.BigDecimal。


建議修改為:


程序員寫出這樣的代碼,能不捱罵嗎?


注意構造 BigDecimal 的參數為 String,千萬別搞錯了,這也是新手易犯的問題。


3.6. 奇葩的註釋,看到就想罵街。


3.6.1. 項目中的某類的註釋。


程序員寫出這樣的代碼,能不捱罵嗎?


代碼的作者是管理員,敢問,管理員 TM 又是誰?而且源文件有過修改,但是修改描述的是啥?著實讓人費解!


3.6.2. 項目中的某方法的註釋。


程序員寫出這樣的代碼,能不捱罵嗎?


方法參數沒有解釋;方法返回值沒有解釋;作者又是屬於管理員;修改描述描述的是個啥?


4.

讓代碼會說話。


4.1. 避免江邊賣水。


4.1.1. 業務接口驗籤代碼片段。


程序員寫出這樣的代碼,能不捱罵嗎?


紅色圈住部分,感覺有點江邊賣水,多此一舉。那麼,可以去掉 false 判斷,建議修改如下:


程序員寫出這樣的代碼,能不捱罵嗎?


同樣的,代碼研發中,true 的判斷也一樣可以去掉。


4.1.2. 用戶登錄代碼片段。


程序員寫出這樣的代碼,能不捱罵嗎?


最後的 else 有點多此一舉,可以省略,可以修改為:


程序員寫出這樣的代碼,能不捱罵嗎?

4.1.3. 用戶是否綁定銀行卡片段。


程序員寫出這樣的代碼,能不捱罵嗎?


在 return 前的判斷,貌似略顯多餘,可以修改為:


程序員寫出這樣的代碼,能不捱罵嗎?


4.2. 減少 Bug,減少圈的複雜度。


程序員寫出這樣的代碼,能不捱罵嗎?

會發現嵌套層數越多,代碼越複雜,其圈複雜度也就可能越高。不過,控制嵌套層數,便是降低 Bug 發生概率的一個有效手段。


例如,下面的代碼片段,項目中可謂是一抓一大把。


程序員寫出這樣的代碼,能不捱罵嗎?


根據場景,可以適當調整如下:


程序員寫出這樣的代碼,能不捱罵嗎?


4.3. 統一作戰,代碼未動,規範先行。


為了讓寫出的代碼能夠清晰閱讀,前提是團隊要進行統一,不能為了個人嗜好,而獨創研發秘笈。


敢問,有哪些需要進行統一呢?


統一的開發環境(JDK版本、集成開發工具 IDE、存放目錄...);

統一的開發框架,更多精力集中到業務開發上;

統一的開發模板,開發工具要進行統一 Scheme;

統一的開發規約,命名、註釋、代碼結構等約束;

統一的 DB 規約,具備一個良好的標準。

統一的 ... ...


5.

代碼評審的過程,會讓人哭笑不得!


鐵打的營盤流水的碼農,你的代碼遲早會被其他同事接手,為了讓接手你代碼的同事,心裡不默默罵你,建議還是好好對待編碼這件事,認真寫好每行代碼。


寫代碼是一件快樂的事情,評審代碼更是一件有趣的事情,通過評審代碼,能夠相互學習,並使代碼更加健壯,提早發現 Bug,所以每一次都不要錯過。


最後,本次分享就到這裡,希望你們能夠喜歡,歡迎多關注「一猿小講」。


分享到:


相關文章: