一、背景
隨着公司的業務發展,項目越來越多,越來越大,復雜性也越來越高。查找一個BUG變得越發抓狂;新人熟悉一塊代碼也變得越發困難。有的時候順手寫下的一行充滿壞味道的代碼,可能當時不會出現什么影響,而且當事人也十分清楚自己寫的東西。但是,當日積月累之后,這種壞代碼越來越多,整個項目就變得混亂不堪,牽一發而動全身,各種錯誤,修復了這影響了那。
二、必需要有規范
這是個老生長談的話題,要解決前面說的這些情況,必須要有一個規范來進行約束。不以規矩不成方圓,而且,這些規范必須也要有比較持續穩定的代碼審核機制來支持。一個公司、團隊值不值得去做這些,這是后話,這里不討論。今天我們只各自闡明一下個人的建議和看法。
三、哪些才是合理的規范
以下這些是自己從網上和實際開發經歷中搜羅的一些開發規范,其中不乏一些已經被說得老掉牙的東西,在這里算是一起重溫一下。大家也可以發表一下自己的看法和覺得不合理的地方,一起交流交流。
1.當一個條件判斷(if,while)比較復雜,請寫好注釋。
2.類中的方法放置順序,按照public,internal,protected,private這樣的順序從上往下放置。並且public中把增刪改方法放在最前,查詢放在之后。
3.字段的確定性盡可能的明確,且盡量按照如下順序定義:const > readonly > 無
4.一個方法中盡量只做一件事,並且命名可以知道這個方法做了什么【方法的命名配合類的命名可以盡可能的簡潔】
優點: (1)避免進行重復造輪子,出現一些重復的冗余的代碼功能塊。
5.如果是一個比較重要或者復雜的方法,需要進行單元測試。
優點: (1)確保系統中從未加入不正確的。不適合的變更;
(2)並且在后期的維護中能夠隨意修改軟件的一部分,而不必擔心在修改的過程中破壞其他的東西。
(3)這也是提升我們勇於進行修改優化舊代碼的信心(不怕改了這邊。那邊出現問題的情況)。
6.邏輯判斷:一個方法里面不要嵌套太多的邏輯判斷(if else或者switch case),嵌套達到三層的判斷就可以考慮把其中的一部分獨立成新方法調用,或者使用盡快返回的方式。
7.生命周期:盡量縮短變量的存活周期,不是必須使用盡量不要使用全局變量
8.變量跨度:變量聲明定義開始到第一次使用該變量的代碼行之間的行距盡可能短
9.在操作非托管對象(如流操作)的時候盡量使用using(),這樣不論在過程中是否發生異常,對象會在該代碼段的最后自動釋放占用資源,這樣能防止手動漏寫相關釋放資源的代碼,讓程序自動回收處理。
10.使用自描述的變量名和方法名(讓命名變得有意義)
11.聲明方法的參數類型時,應盡量指定最弱的類型,最好是接口而不是基類。例如,如果要寫一個方法來處理一組數據項,最好是用接口(比如IEnumerable<T>)來聲明方法的參數,而不要用強數據類型(比如List<T>)或者更強的接口類型(比如ICollecion<T>或IList<T>)。
原因是可傳遞的參數對象變多。當然,如果方法需要的是一個列表(而非僅僅是可枚舉的對象),就應該將參數類型聲明為IList<T>。但是,仍然要避免聲明為List<T>。聲明為IList<T>,調用者可傳遞實現了IList<T>的其他類型對象。
同理,有基類的盡量使用基類。除非有特定原因。
相反,返回的時候返回最強的類型。
12.當一個方法的參數數量大於5個的時候,如果可能,聲明一個單獨的類進行封裝。
12.從數據庫獲取一個數據集合時,如果未獲取到數據,那么返回一個空集合,不要返回null。
13.對於一個方法超出了整個屏幕可以顯示的范圍,盡量去分割它(這時候屏幕大的優勢就體現出來了)。
14.盡可能的考慮到會出現異常的數據情景,多使用條件判斷來處理異常,而不是更多的try catch。
15.避免出現上帝類,每個類做其類名該做的事情。
16.代碼寫完之后要習慣進行統一的格式化
17.添加注釋
① 類注釋
類的注釋,需要描述類的功能、依賴和如何使用
②代碼注釋
復雜的邏輯應當添加注釋
③使用Region
使用關鍵字region注釋使代碼更加整潔
④全局變量注釋
每個全局變量需要寫注釋
⑤程序流程變化注釋
switch, if, while 等條件判斷地方必須寫注釋
⑥public方法注釋
public的方法體中的代碼,需要寫好詳盡的注釋
歡迎大家提出寶貴建議。
▶關於作者:張帆(Zachary,個人微信號:Zachary-ZF)。堅持用心打磨每一篇高質量原創。歡迎掃描右側的二維碼~。
定期發表原創內容:架構設計丨分布式系統丨產品丨運營丨一些思考。
如果你是初級程序員,想提升但不知道如何下手。又或者做程序員多年,陷入了一些瓶頸想拓寬一下視野。歡迎關注我的公眾號「跨界架構師」,回復「技術」,送你一份我長期收集和整理的思維導圖。
如果你是運營,面對不斷變化的市場束手無策。又或者想了解主流的運營策略,以豐富自己的“倉庫”。歡迎關注我的公眾號「跨界架構師」,回復「運營」,送你一份我長期收集和整理的思維導圖。