關於什麼是好代碼,軟體行業爛大街的名詞一大堆,什麼高內聚、低耦合、可復用、可擴展、健壯性等等。也有所謂設計6原則—SOLID,即Single Responsibility (單一職責),Open Close(開閉),Liskov Substitution(里氏替換),Interface Segreg ...
關於什麼是好代碼,軟體行業爛大街的名詞一大堆,什麼高內聚、低耦合、可復用、可擴展、健壯性等等。也有所謂設計6原則—SOLID,即Single Responsibility (單一職責),Open Close(開閉),Liskov Substitution(里氏替換),Interface Segregation(介面隔離),Dependency Inversion(依賴反轉)
詳情可參考: https://www.cnblogs.com/huangenai/p/6219475.html
不喜歡這些抽象名詞,我們搞點簡單明瞭的。一匹跑得快,少生病(健壯),可以馱載各類貨物(可擴展),容易辨識(容易看懂),病好治(bug好發現),高大英俊的千里汗血馬是也
什麼是好代碼,不好定義,但是關於什麼是代碼里的"壞味道",比較容易搞清楚,避免代碼里的“壞味道",離好的代碼就不遠了,壞味道一二三:
- 代碼重覆
- 函數太長
如果太長(一般不宜超過200行,但不絕對),你自己都不太容易讀懂,請不要猶豫,拆成小函數吧。筆者剛畢業,參與一個大型複雜的金融軟體,核心業務類,函數1000行算小case,5000多行的不在少數,我的內心是哇涼哇涼的,一萬隻草泥馬在心中奔騰,還好大致邏輯比較清晰
- 類太大
一般不宜操過1000行,同樣不絕對,jdk源碼過千行的不少嘛。還是那個大型複雜的金融軟體,核心的幾個Algo C++文件,2萬到3萬行,我的心在滴血
- 函數參數列表太長
工作中有7個參數的函數調用,搞清楚每個參數的業務含意,和順序有點頭暈。儘管可能有預設函數參數,不小心的時候確實範過錯誤,後面直接引入一個線上bug,緊張
- 變數名、函數名稱、類名、介面等命名含義不清晰
圖02 程式員最頭疼的事
苦命的天朝程式員,還要把中文翻譯為英文,我也很頭大鴨。函數名能讓人望名知義,看名字就知道函數的功能是啥,以至於幾乎不需要多少comments最好
- 太多的if else
- 在迴圈里定義大量耗資源的變數
大對象,如果可以放在迴圈外,被共用,推薦這麼搞
- try 塊代碼太長
try塊只包住真的可能發生異常的語句
- 不用的資源未及時清理掉,流及時關閉
如IO句柄,資料庫連接,網路連接等。不清理掉,後果很嚴重,你若不信,軟體就死給你看
- try-finally醜陋,明顯更愛try-with-resources,顏控,沒辦法
1)醜陋的
static String firstLineOfFile(String path) throws IOException{ BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } }
2)漂亮的小姐姐
static String firstLineOfFile(String path) throws IOException{ try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }
- 迴圈里字元串的拼接不要用”+“
有改過一個OutOfMemery的bug,字元串拼接用”+“,產生了一百多萬的字元串變數。用Visual VM程式占用記憶體空間比較多,數量最大的,通常都是String,所以用StringBuilder的append吧
- 太巨量的迴圈,不推薦用乘除法
移位運算吧,效率快太多,參看redis rehashing.c hash key計算的代碼片段(因為hash key的計算會高頻度用到)
- 避免運行時大量的反射
不知道Java社區為什麼不太關註反射耗時的問題,以前寫C#都會謹慎使用,C#社區有專門的討論
- 基本類型優於裝箱基本類型
基本類型更快,更省空間。避免不經意引起自動裝箱和拆箱。是否相等的比較,裝箱基本類型可能回出錯
- 未作參數有效性檢查
不搞這個,空異常妥妥地
- 延遲初始化和懶載入
這個的確是一種優化,即需要用到它的值時,才初始化。如果永不用到,就永遠不會被初始化。但要慎用
- HashMap、ArrayList等集合類,沒有初始化數量
如果大致知道業務場景下這些集合類的數量,初始哈吧。不然預設好多16,結果你有1100個,會有數次重新分配記憶體和拷貝,費時間啊,我也懶,想耍啊
未完待續,困了
註:
參考《Effective java》《重構 —— 改善既有代碼的設計》
*****************************************************************************************************
精力有限,想法太多,專註做好一件事就行
- 我只是一個程式猿。5年內把代碼寫好,技術博客字字推敲,堅持零拷貝和原創
- 寫博客的意義在於鍛煉邏輯條理性,加深對知識的系統性理解,鍛煉文筆,如果恰好又對別人有點幫助,那真是一件令人開心的事
*****************************************************************************************************