編寫高質量程式碼的思考

肖漢鬆發表於2017-08-10

前言

最近在看《程式碼大全》,可以說是一本軟體開發的百科全書,特別厚,但是乾貨也很多。平時寫程式碼,程式碼規範是一個最低的要求(很多老程式碼連最低要求都達不到),為什麼要這樣規定程式碼要這麼寫,而不是那麼寫?這是一個值得深究的問題。而不是說我照著程式碼規範寫程式碼就算完了,高質量的程式碼是一個專業工程師的追求。要知其然知其所以然,最近寫發票解析的程式碼,因為涉及帶解析PDF的演算法,複雜度比較高,所以花了很多時間在重構,學以致用的時候積累了一些心得。

資訊隱藏原則

資訊隱藏是物件導向設計的一個原則,是對封裝和模組化的一個更高維度的概括。從Java的整個訪問限制設計就體現了資訊隱藏的原則,各種訪問修飾符:public,protect,private,在類設計的時候,我們就要決定什麼暴露給外部,什麼隱藏起來。

舉一個例子下面的程式碼表示一個有自增ID的Person類。

上面的類設計有什麼問題呢?它違反了資訊隱藏的原則,直接將ID分配的方式暴露了,這會給後面的維護帶來很多問題:當你想給id的範圍做出限制的時候怎麼辦?當你在所有程式碼中使用++G_MAX_ID分配ID時突然需要修改ID分配的演算法怎麼辦?是不是需要去改所有++G_MAX_ID出現的地方?更好的設計是將ID的分配演算法隱藏起來。

咋一看只是將++G_MAX_ID寫到一個方法裡面而已,但是它隱藏了ID分配的演算法,讓呼叫者不需要關心裡面的實現,同時控制了變化,不管ID分配演算法怎麼變,都不會影響其他的程式碼。呼叫者瞭解的資訊越多,受到的影響就越大,資訊隱藏可以降低複雜度,控制變化的範圍。

上面的例子只是資訊隱藏的一個簡單應用,下面我們來舉幾個其他的應用例子:

  • 為什麼不推薦使用魔法值(即未經定義的常量)?:這個明顯違反了資訊隱藏的原則,當你將字面量直接寫在程式碼裡面時,就將資訊直接暴露了,後面需要修改的時候,一旦少改了某個地方的字面量,bug就出現了。
  • 迴圈依賴(即A呼叫B,B呼叫A的情況):類或方法之間的迴圈依賴會破壞資訊隱藏,一個很直接的影響就是在測試的時候,A,B都需要同時準備好才能進行測試,而無法mock任意一方。
  • 使用全域性變數:這個就不用說了,所有人都可以訪問你的時候資訊就暴露無疑了,全域性變數能不用就不用。
  • 考慮效能損失:有時候我們為了一些效能上的考慮就破壞資訊隱藏原則,將一些變數全域性化,這樣效能提高得不多,維護成本卻上升不少,完全是得不償失。

最後總結一下資訊隱藏的好處:

  • 隱藏資訊即隱藏了複雜度,降低了程式設計的負擔。
  • 隱藏資訊即隱藏了底層變化,以便於在區域性控制變化。

一些不太常見的程式設計技巧

函式(function)與過程(procedure)的選擇

我們先來看看函式與過程區別:

  • Function:有返回值的方法
  • Procedure:沒有返回值的方法

平時我們程式設計其實沒有太區別函式與過程,什麼時候用函式,什麼時候用過程其實沒有過多的考慮,感覺都可以用。一個選擇的規則就是當你的方法的目的是想返回跟你方法名稱相符的值的時候用函式,否則用過程

舉個例子,我看過很多XXProcessor介面裡面的方法都是XX process(),嚴格來講,這樣的命名是不符合上面的規則的,process是一個沒有含義的命名,但是卻有返回值,如果沒有返回值那它的命名才是合理的。

當然了,上面的規則僅供參考,世事無絕對,具體情況具體分析,當你不清楚用函式還是用過程的時候,可以參考這個規則。

使用boolean值來給程式做註釋

相信大家看到一個if語句有很多條件的時候都會特別頭痛,因為很難理解。例如下面的例子:

但如果換成下面的寫法,用boolean值的名字來給if語句註釋,看起來就很好理解了。

總結

怎麼寫高質量的程式碼是一個很大的話題,這裡只是拋磚引玉,其實物件導向設計的很多原則都能夠給我們寫程式碼的時候提供指導,寫程式碼的時候要時刻記得學以致用,而不是敷衍了事,專業的軟體工程師必然要能寫得一手好程式碼。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

編寫高質量程式碼的思考 編寫高質量程式碼的思考

相關文章