因?yàn)檐浖毕輹?huì)讓我們?cè)陂_發(fā)人員中顯得很糟糕,并導(dǎo)致其他人對(duì)我們的看法降低,所以最好避免編寫缺陷,快速識(shí)別和修復(fù)缺陷,或者掩蓋我們的缺陷。有許多博客文章和文章討論如何避免bug以及如何識(shí)別和修復(fù)bug,因此,在這篇文章中,介紹一些最有效的策略,以徹底解決Java代碼庫(kù)中的問題。通過(guò)參加java培訓(xùn),你可以學(xué)習(xí)更多java開發(fā)技能,提升自己。
1. 吞咽檢查異常
當(dāng)我們不小心在代碼中引入了bug時(shí),異常就是其中之一。在方法上聲明throws子句或捕獲已檢查的異常也是一件麻煩事。這兩個(gè)問題的解決方案都是在異常可能被拋出時(shí)捕獲異常(即使它是正在運(yùn)行時(shí)一場(chǎng)),而不執(zhí)行任何操作。這使API保持簡(jiǎn)潔,對(duì)于檢查的異常,人們幾乎無(wú)能為力。通過(guò)不記錄它或?qū)λ鋈魏问虑?,甚至沒有人需要知道它曾經(jīng)發(fā)生過(guò)。
2. 注釋掉或刪除不滿意的單元測(cè)試
失敗的單元測(cè)試可能會(huì)讓人分心,并且很難確定新功能何時(shí)破壞了測(cè)試。它們還可以揭示我們?cè)诖a更改時(shí)破壞了某些東西。注釋掉這些失敗的單元測(cè)試將使單元測(cè)試報(bào)告更清晰,并且更容易查看是否有其他人的新功能破壞了單元測(cè)試。
3. 在基于JUnit的單元測(cè)試中使用@Ignore
注釋掉失敗的單元測(cè)試似乎令人不快,所以另一個(gè)可能更令人愉快的選擇是用@Ignore注釋失敗的基于JUnit的單元測(cè)試方法。在java培訓(xùn)中,也有關(guān)于單元測(cè)試的學(xué)習(xí),理論知識(shí)+實(shí)踐項(xiàng)目,雙管齊下,學(xué)以致用,讓你深入淺出地學(xué)習(xí)java。
4. 完全刪除單個(gè)測(cè)試
如果用@Ignore注釋一個(gè)中斷的測(cè)試或用@Ignore注釋一個(gè)中斷的測(cè)試是不令人滿意的,因?yàn)橛腥丝赡苋匀粰z測(cè)到我們破壞了一個(gè)單元測(cè)試,那么我們可以簡(jiǎn)單地將有問題的單元測(cè)試全部刪除。
5. 注釋掉令人不快的斷言
我們不一定需要注釋掉或刪除整個(gè)測(cè)試。它可以簡(jiǎn)單到注釋掉或刪除單元測(cè)試方法中的斷言語(yǔ)句。該方法每次都可以成功執(zhí)行和運(yùn)行,因?yàn)闆]有斷言意味著沒有失敗的方法。當(dāng)單元測(cè)試方法非常長(zhǎng)且復(fù)雜,因此不容易發(fā)現(xiàn)缺少斷言時(shí),這種方法尤其有效。
6. 用無(wú)用和冗余測(cè)試的噪音分散注意力
注釋掉單元測(cè)試,用@Ignore注釋基于JUnit的單元測(cè)試,甚至刪除單元測(cè)試,對(duì)于在Java中徹底解決問題來(lái)說(shuō),這些策略可能太明顯了。為了使這些不那么明顯,另一個(gè)有效的策略是在同一個(gè)單元測(cè)試類中編寫大量不必要的和冗余的測(cè)試方法,這樣看起來(lái)似乎正在進(jìn)行全面的測(cè)試,但實(shí)際上,只有一小部分功能(我們知道的子集正在工作)正在進(jìn)行測(cè)試。想要學(xué)習(xí)java更多知識(shí)和技能,可以考慮參加java培訓(xùn),有經(jīng)驗(yàn)豐富的專業(yè)講師指導(dǎo)教學(xué),有緊跟市場(chǎng)需求的實(shí)時(shí)課程,可以讓你快速掌握這門技術(shù),節(jié)約時(shí)間,少走彎路。
7. 編寫單元測(cè)試,以“證明”您的代碼是正確的,即使它不是
我們可以利用這樣一個(gè)事實(shí),即單元測(cè)試只能測(cè)試單元測(cè)試的作者認(rèn)為被測(cè)試軟件的預(yù)期行為,從而編寫單元測(cè)試來(lái)證明我們的代碼是正確的。如果我們將兩個(gè)整數(shù)相加的代碼在提供2和2時(shí)意外返回5的總和,那么我們可以簡(jiǎn)單地將單元測(cè)試中的預(yù)期結(jié)果也設(shè)置為5。給出了一份漂亮的單元測(cè)試報(bào)告,沒有人會(huì)更明智。
8. 避免記錄詳細(xì)信息
日志可能會(huì)暴露軟件問題,處理此風(fēng)險(xiǎn)的有效方法是根本不記錄日志,只記錄例行操作和結(jié)果,并在記錄的消息中留下詳細(xì)信息(尤其是上下文)。對(duì)平凡細(xì)節(jié)的過(guò)度記錄也會(huì)掩蓋任何可能暴露代碼弱點(diǎn)的更有意義的消息。
9. 避免使用描述性的toString()實(shí)現(xiàn)
一個(gè)描述性的toString()方法可以揭示太多關(guān)于任何給定實(shí)例的狀態(tài),并揭示我們的錯(cuò)誤。不覆蓋對(duì)象。toString()會(huì)使識(shí)別問題和將問題與任何給定代碼或開發(fā)人員關(guān)聯(lián)變得更加困難。跟蹤問題所需的額外時(shí)間為您提供了更多的時(shí)間,以便在發(fā)現(xiàn)是您的代碼出了問題之前進(jìn)入下一個(gè)項(xiàng)目。如果您編寫的Java類使用描述性toString()擴(kuò)展了一個(gè)類,那么您可以在擴(kuò)展類中重寫該方法而不做任何事情(有效地刪除可能導(dǎo)致toString()錯(cuò)誤的輸出)。如果您想讓它看起來(lái)好像從未在繼承層次結(jié)構(gòu)中實(shí)現(xiàn)過(guò)一樣,請(qǐng)確保擴(kuò)展類的toString()方法返回系統(tǒng)。標(biāo)識(shí)hash代碼(此)。在java培訓(xùn)中,既有理論知識(shí)的學(xué)習(xí),還有實(shí)戰(zhàn)操作項(xiàng)目,讓你將學(xué)到的知識(shí)真正運(yùn)用到實(shí)踐中去,更全面地掌握java知識(shí)和技能。
10. 不要讓NullPointerExceptions背叛你
NullPointerExceptions可能是Java開發(fā)人員處理的最常見的異常。這些特別危險(xiǎn),因?yàn)樗鼈兘?jīng)常暴露代碼的弱點(diǎn)。一種策略是簡(jiǎn)單地用try-catch包裝每一行代碼,并簡(jiǎn)單地吞下異常(包括NPE)。
另一個(gè)不太明顯的策略是通過(guò)從不返回或傳遞空值來(lái)避免NPE。有時(shí),使用默認(rèn)值代替null(例如空字符串或集合)是有意義的,但有時(shí)我們必須更具創(chuàng)造性地避免null。在這一點(diǎn)上,使用“默認(rèn)”非空值代替空值是很有用的。
關(guān)于如何處理這種任意的非空缺省值,有兩種觀點(diǎn)。一種方法是使用數(shù)據(jù)集中最常見的值作為默認(rèn)值,因?yàn)槿绻峭ㄓ玫?,那么?dāng)更多的值出現(xiàn)時(shí),可能不會(huì)注意到它,并且您更有可能擁有處理該通用值的代碼,而不會(huì)發(fā)生意外。另一方面,如果您有一個(gè)幾乎從未使用過(guò)的值,這可以成為一個(gè)良好的默認(rèn)值,因?yàn)槭芩绊懙拇a(尤其是經(jīng)過(guò)良好測(cè)試的代碼)可能比通常預(yù)期的值少。正在考慮從事java職業(yè)的同學(xué)建議報(bào)名參加java培訓(xùn)來(lái)學(xué)習(xí),有系統(tǒng)規(guī)范的課程和明確清晰的學(xué)習(xí)路線,可以在短時(shí)間內(nèi)獲得快速提升。