天天看點

更新 Java 程式設計規範的6個約定

作為 java 開發人員,我們會遵循一系列的編碼風格和開發習慣。習慣使然是一方面,另一方面,我們也從不停下腳步質疑這些習慣。一段時間以後,筆者養成了一些不同于常人的編碼風格和開發習慣。當第一次了解到這些編碼風格時,筆者感到又驚又氣。但是,花了一段時間踐行這些習慣之後,筆者意識到它們的确能造就更加簡潔可控的代碼庫,同時也讓開發者更加省心。

不要因這些想法的另類而否定它們,筆者建議你用幾周時間嘗試其中的一兩條,如果你仍然不喜歡它們,換回以前的代碼風格也用不了多久時間。

筆者一度認為業内對于零注釋這種程式設計習慣已經達成共識,但是當與許多同僚合作之後,筆者發現事實并非如此。是以,讓我們再次探讨這個問題:無注釋。注釋很快就會與代碼脫節。假如你在一段代碼的上面寫了行注釋,誰也不能保證下一個修改代碼的人會更新注釋。根據筆者的開發經驗,沒人會更新注釋。原來的代碼段可能被删除,業務需求也可能改變。是以,你的注釋往往弊大于利。

對此,有個簡單的解決方案,就是寫自記錄代碼(self documenting code)。對變量、對象或者函數等進行命名時,選擇能清晰表達其用途的名字。假如不夠清晰,你需要對它們進行重構,将之拆分為更簡潔的形式。隻要能直覺地表達其用途,過長的名字也無需擔憂。别忘了編輯器有自動填寫功能,沒人需要敲出整個辨別符的名字。

然而,公共 api 是一個明顯的例外。假如你正在建立一個準備公開發版的庫,那還是使用簡潔的方法名比較好。不過, javadoc 對這種情況大有裨益,但也僅限此情況。

确實沒有必要這麼做。你寫的方法會注釋為測試,方法所在的類也存在于測試包中。明眼人都知道那是測試。其實,測試方法名應該明确指出測試的内容與條件。例如, “reversesthewordrandomtomodnar()”或者“adds70tobalanceof100tomakebalanceof170()”,這些名字都準确表達了測什麼功能以及預期的結果。

如果你正在使用 intellij ,有一款特别棒的插件叫做 enso 。它可以将測試名轉化成一個句子,一目了然地顯示測試的内容。這意味着當你在注視任何類的時候, enso 都會展示其說明文檔。

這個觀點争議頗多,請聽筆者說完。假如你不使用 @override ,最壞的結果就是你重寫了一個函數,而調用時執行的卻是原版函數,而非重寫的版本。值得慶幸的是,在測試驅動開發模式下,測試整段代碼時就會定位到這個 bug 。這讓 @override 成了一段備援的代碼。顯然,備援的代碼不僅沒有好處,還會讓人分心。是以,停止使用 @override ,而依賴 tdd(測試驅動開發)。

這确實讓人不由得感到惱火。 getxxx 和 setxxx 這種命名方式是 javabeans 時代的前朝遺物。而 javabeans 時代早已過去,這種命名方式也不再适用了。後者讓代碼變得令人反感卻沒有帶來什麼好處。去掉 get/set 這類關鍵字有利于字段名稱的簡潔。例如, car.engine() 函數将生成一個引擎對象,而 car.engine(new v8()) 将引擎設定為新的型号。如果需要讀取多層級内的對象(例如:car.lights().frontleft() 對比 car.getlights().getfrontleft()),前者依舊表達清晰而且代碼更加簡潔。這個程式設計習慣筆者一開始也很反對,後來逐漸改變了看法,現在非常熱衷這一風格。

這段内容和代碼風格關系不大,而是更加泛泛而談。每次看到人們為了一個問題,精雕細刻地設計解決方案,花費大量的時間,筆者都會感到不悅。其實,在最基本的層面上解決問題然後測試性能。十有八九,這類方案都是高速,可擴充或符合其他時髦概念的。相反,筆者經常看到人們設計了一個複雜的緩存解決方案,結果沒有提高性能卻把代碼弄成一團亂麻。解決問題時,先實施你能采取的最基本方案,然後再進行優化。最起碼,這種方式能讓你有執行個體證明問題已經解決。

筆者又一次錯誤地認為這一開發習慣是業内的共識。 java 中的檢查性異常 (checked exceptions) 很糟糕,幾乎所有其他程式設計語言(例如c#)都意識到了這一點,是以它們甚至沒有這個類型。在筆者編寫的任何應用程式中,都會建立自己的異常類型,在這些應用程式中抛出的任何異常都會用筆者建立的異常類接住,然後抛出運作時異常。這讓代碼更加整潔(筆者從未在程式中抛出大量 xxxexception ),也意味着筆者能通過 log 追朔異常來自代碼的哪一部分或者這是完全出乎意料的異常類型。

(編譯自:https://dzone.com/articles/upgrade-your-code-conventions-2)

oneapm 為您提供端到端的 java 應用性能解決方案,我們支援所有常見的 java 架構及應用伺服器,助您快速發現系統瓶頸,定位異常根本原因。分鐘級部署,即刻體驗,java 監控從來沒有如此簡單。想閱讀更多技術文章,請通路 oneapm 官方技術部落格。

本文轉自 oneapm 官方部落格