最近一直在做修改bug工作,修改bug花費時間最多的不是如何解決問題而是怎樣快速讀懂代碼。如果代碼寫的好的,不用debug就可以一眼看出來哪裡出了問題。實際上,我都要debug好多遍才能差不多了解這個業務邏輯,進而分析原因以及修改修複的代價。這項工作花費了我絕大部分的時間,而且并沒有什麼意義,因為fix bug之後就再也不會處理這些代碼了。
是以,易讀性應該放在代碼的首要位置,如果長期維護的話。
什麼樣的命名才是好的?可以表明這個方法的功能,而且名字長度不要太長。如果名字無法完整的表述含義,則應該添加注釋。我debug的代碼從來沒看到過注釋。
if用的真不要太多,debug的時候發現一個if又一個if,if裡面嵌套if。也許這是為了邏輯的完整性,但是千萬要在每個if分支裡都給出一個結束的定義,即這個if結束了,主要做了什麼。經常debug if之後還沒有了解這個分支是幹嘛的,然後去看下一個分支。
不應該鄙視if,因為這是業務發展過程中代碼的補充。突然換了需求,又不能丢掉原來的代碼,隻能if。随着時間推移,問題也就出來了。應該想着去換個設計模式去重構這段代碼,而不是趕時間加一個if,這個在後期維護中是代價極大。
exception的處理基本都是try catch, 然後基于當時的想法決定是否抛出去。當我重新debug的時候,我不知道這個位置抛出去了對上一級是否有影響,不抛出去又會怎麼樣。
遇到大塊的代碼就提取出來,這是最簡單的重構。然而,當你debug從一個方法進入另一個方法再進入另一個方法,回頭又跳回來,絕對懵逼。
重構的時候一定要在該方法領域内完整的闡述功能,而不要為了重構而重構,結果語義不完整,代碼很分散。
項目大了之後,服務分拆成各種微服務。于是,各種調用webservice. webservice傳回xml或者json。傳回xml的燒了,暫且不提。傳回json的,我們明明有<code>jackson/gson</code>等各種json序列化工具,隻要建立好model,直接映射過來就好。甚至還有JsonInclude,JsonPropertyIgnore等條件配置。而偏偏很多接口使用一個JsonObject來接收response。然後來一個map方法,調用JsonObject的各個屬性的來擷取各個值,再手動丢進一個model裡。
到這裡,項目中使用<code>org.codehaus.jettison.json</code>來處理json資料,這個架構有個問題,JsonObject.get(key)的時候,如果key不存在,則不是傳回null,而是抛出一個exception。我最近修改了兩個bug都是因為response中沒有這個key而抛出的異常。而response之是以沒有這個key是因為webservice那邊處理傳回結果model不一定。正确的則傳回這樣,失敗了則傳回其他字段。而client的這端,沒有預料到失敗的結果映射,或者說以不變應萬變,用exception來反映失敗。
是以,webservice一定要定義好傳回的model,失敗了,不要一下是warning,一下是message。這樣也可以,但要有文檔說明你們傳回的結果是什麼model,client好做映射。client這邊最好還是不要手動映射了,媽的出錯了debug也很煩。client可以封裝多個model,比如正常的model,失敗的model。先序列化為正常的,序列化失敗則序列化為失敗的model。
唯有不斷學習方能改變!
-- <b>Ryan Miao</b>