摘要:對變量對象或者函數(shù)等進行命名時,選擇能清晰表達其用途的名字。其實,測試方法名應(yīng)該明確指出測試的內(nèi)容與條件。和這種命名方式是時代的前朝遺物。使用自己的異常類型筆者又一次錯誤地認(rèn)為這一開發(fā)習(xí)慣是業(yè)內(nèi)的共識。
作為 Java 開發(fā)人員,我們會遵循一系列的編碼風(fēng)格和開發(fā)習(xí)慣。習(xí)慣使然是一方面,另一方面,我們也從不停下腳步質(zhì)疑這些習(xí)慣。一段時間以后,筆者養(yǎng)成了一些不同于常人的編碼風(fēng)格和開發(fā)習(xí)慣。當(dāng)?shù)谝淮瘟私獾竭@些編碼風(fēng)格時,筆者感到又驚又氣。但是,花了一段時間踐行這些習(xí)慣之后,筆者意識到它們的確能造就更加簡潔可控的代碼庫,同時也讓開發(fā)者更加省心。
不要因這些想法的另類而否定它們,筆者建議你用幾周時間嘗試其中的一兩條,如果你仍然不喜歡它們,換回以前的代碼風(fēng)格也用不了多久時間。
零注釋(公共 API 除外)筆者一度認(rèn)為業(yè)內(nèi)對于零注釋這種編程習(xí)慣已經(jīng)達成共識,但是當(dāng)與許多同事合作之后,筆者發(fā)現(xiàn)事實并非如此。所以,讓我們再次探討這個問題:無注釋。注釋很快就會與代碼脫節(jié)。假如你在一段代碼的上面寫了行注釋,誰也不能保證下一個修改代碼的人會更新注釋。根據(jù)筆者的開發(fā)經(jīng)驗,沒人會更新注釋。原來的代碼段可能被刪除,業(yè)務(wù)需求也可能改變。因此,你的注釋往往弊大于利。
對此,有個簡單的解決方案,就是寫自記錄代碼(self documenting code)。對變量、對象或者函數(shù)等進行命名時,選擇能清晰表達其用途的名字。假如不夠清晰,你需要對它們進行重構(gòu),將之拆分為更簡潔的形式。只要能直觀地表達其用途,過長的名字也無需擔(dān)憂。別忘了編輯器有自動填寫功能,沒人需要敲出整個標(biāo)識符的名字。
然而,公共 API 是一個明顯的例外。假如你正在建立一個準(zhǔn)備公開發(fā)版的庫,那還是使用簡潔的方法名比較好。不過, Javadoc 對這種情況大有裨益,但也僅限此情況。
不要用 “Test” 為測試方法開頭確實沒有必要這么做。你寫的方法會注釋為測試,方法所在的類也存在于測試包中。明眼人都知道那是測試。其實,測試方法名應(yīng)該明確指出測試的內(nèi)容與條件。例如, “reversesTheWordRandomToModnar()”或者“adds70ToBalanceOf100ToMakeBalanceOf170()”,這些名字都準(zhǔn)確表達了測什么功能以及預(yù)期的結(jié)果。
如果你正在使用 IntelliJ ,有一款特別棒的插件叫做 Enso 。它可以將測試名轉(zhuǎn)化成一個句子,一目了然地顯示測試的內(nèi)容。這意味著當(dāng)你在注視任何類的時候, Enso 都會展示其說明文檔。
不要使用@Override這個觀點爭議頗多,請聽筆者說完。假如你不使用 @override ,最壞的結(jié)果就是你重寫了一個函數(shù),而調(diào)用時執(zhí)行的卻是原版函數(shù),而非重寫的版本。值得慶幸的是,在測試驅(qū)動開發(fā)模式下,測試整段代碼時就會定位到這個 bug 。這讓 @Override 成了一段冗余的代碼。顯然,冗余的代碼不僅沒有好處,還會讓人分心。因此,停止使用 @Override ,而依賴 TDD(測試驅(qū)動開發(fā))。
不要使用 getX()/setY() 這樣的函數(shù)名這確實讓人不由得感到惱火。 getXXX 和 setXXX 這種命名方式是 Javabeans 時代的前朝遺物。而 JavaBeans 時代早已過去,這種命名方式也不再適用了。后者讓代碼變得令人反感卻沒有帶來什么好處。去掉 get/set 這類關(guān)鍵字有利于字段名稱的簡潔。例如, car.engine() 函數(shù)將生成一個引擎對象,而 car.engine(new v8()) 將引擎設(shè)置為新的型號。如果需要讀取多層級內(nèi)的對象(例如:car.lights().frontLeft() 對比 car.getLights().getFrontLeft()),前者依舊表達清晰而且代碼更加簡潔。這個編程習(xí)慣筆者一開始也很反對,后來逐漸改變了看法,現(xiàn)在非常熱衷這一風(fēng)格。
可運行的代碼>高性能的代碼這段內(nèi)容和代碼風(fēng)格關(guān)系不大,而是更加泛泛而談。每次看到人們?yōu)榱艘粋€問題,精雕細(xì)刻地設(shè)計解決方案,花費大量的時間,筆者都會感到不悅。其實,在最基本的層面上解決問題然后測試性能。十有八九,這類方案都是高速,可擴展或符合其他時髦概念的。相反,筆者經(jīng)常看到人們設(shè)計了一個復(fù)雜的緩存解決方案,結(jié)果沒有提高性能卻把代碼弄成一團亂麻。解決問題時,先實施你能采取的最基本方案,然后再進行優(yōu)化。最起碼,這種方式能讓你有實例證明問題已經(jīng)解決。
使用自己的異常類型筆者又一次錯誤地認(rèn)為這一開發(fā)習(xí)慣是業(yè)內(nèi)的共識。 Java 中的檢查性異常 (Checked exceptions) 很糟糕,幾乎所有其他編程語言(例如C#)都意識到了這一點,所以它們甚至沒有這個類型。在筆者編寫的任何應(yīng)用程序中,都會創(chuàng)建自己的異常類型,在這些應(yīng)用程序中拋出的任何異常都會用筆者創(chuàng)建的異常類接住,然后拋出運行時異常。這讓代碼更加整潔(筆者從未在程序中拋出大量 XXXException ),也意味著筆者能通過 log 追朔異常來自代碼的哪一部分或者這是完全出乎意料的異常類型。
(編譯自:https://dzone.com/articles/upgrade-your-code-conventions-2)
OneAPM 為您提供端到端的 Java 應(yīng)用性能解決方案,我們支持所有常見的 Java 框架及應(yīng)用服務(wù)器,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸,定位異常根本原因。分鐘級部署,即刻體驗,Java 監(jiān)控從來沒有如此簡單。想閱讀更多技術(shù)文章,請訪問 OneAPM 官方技術(shù)博客。
本文轉(zhuǎn)自 OneAPM 官方博客
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65355.html
摘要:經(jīng)過年時間的發(fā)展,到目前為止,最新穩(wěn)定版為版本。的發(fā)展剛出生的時候,引起了很多開源社區(qū)的關(guān)注,并且也有個人和企業(yè)開始嘗試使用。通過項目搭建過程來對比的差異和優(yōu)勢。當(dāng)然它的作用不僅于此,后續(xù)會逐步揭開它的真實面目。而和就相當(dāng)于當(dāng)年的和的關(guān)系。 要了解Spring Boot的發(fā)展背景,還得從2004年Spring ...
摘要:編程規(guī)范筆記上寫在前面從語言開始,自己陸續(xù)學(xué)習(xí)了,但是自從研究生做畢設(shè)接觸以來,就愛不釋手,再也沒有動力嘗試其他語言。一與的一大優(yōu)勢就是具備優(yōu)秀的可讀性,而這基于一套較為完整的公認(rèn)編程規(guī)范。如原本希望的結(jié)果是,結(jié)果卻完全一樣。 Python編程規(guī)范筆記(上) 寫在前面: 從C語言開始,自己陸續(xù)學(xué)習(xí)了C++/Java,但是自從研究生做畢設(shè)接觸Python以來,就愛不釋手,再也沒有動力嘗試...
摘要:如何快速搭建一個微服務(wù)架構(gòu)上圖異步通信方式通常異步的生產(chǎn)者消費者模式,通過等異步消息通訊協(xié)議規(guī)范。數(shù)據(jù)的去中心化,進一步降低了微服務(wù)之間的耦合度,不同服務(wù)可以采用不同的數(shù)據(jù)庫技術(shù)等。 什么是微服務(wù)? 微服務(wù)(Microservices Architecture)是一種架構(gòu)風(fēng)格,一個大型復(fù)雜軟件應(yīng)用由一個或多個微服務(wù)組成。系統(tǒng)中的各個微服務(wù)可被獨立部署,各個微服務(wù)之間是松耦合的。每個微服...
摘要:數(shù)據(jù)的去中心化,進一步降低了微服務(wù)之間的耦合度,不同服務(wù)可以采用不同的數(shù)據(jù)庫技術(shù)等。微服務(wù)架構(gòu)是持續(xù)交付的巨大推動力,允許在頻繁發(fā)布不同服務(wù)的同時保持系統(tǒng)其他部分的可用性和穩(wěn)定性。 什么是微服務(wù)? 微服務(wù)(Microservices Architecture)是一種架構(gòu)風(fēng)格,一個大型復(fù)雜軟件應(yīng)用由一個或多個微服務(wù)組成。系統(tǒng)中的各個微服務(wù)可被獨立部署,各個微服務(wù)之間是松耦合的。每個微服務(wù)...
變量 正如你在上一課中所了解到的,對象將其狀態(tài)存儲在字段中。 int cadence = 0; int speed = 0; int gear = 1; 什么是對象?討論向你介紹了字段,但你可能還有一些問題,例如:命名字段的規(guī)則和約定是什么?除了int之外,還有哪些其他數(shù)據(jù)類型?在聲明字段時是否必須初始化字段?如果未明確初始化字段,是否為字段分配了默認(rèn)值?我們將在本課中探討這些問題的答案,但在我們...
閱讀 2027·2021-11-19 11:37
閱讀 715·2021-11-11 16:54
閱讀 1161·2021-11-02 14:44
閱讀 3049·2021-09-02 15:40
閱讀 2368·2019-08-30 15:44
閱讀 951·2019-08-29 11:17
閱讀 1059·2019-08-26 14:06
閱讀 1552·2019-08-26 13:47