錯誤模式:介紹診斷和糾正 Java 程序中反復出現的錯誤類型 ![]() |
![]() |
級別: 初級 Eric E. Allen , 軟件工程師, Cycorp, Inc 2001 年 2 月 19 日 歡迎光臨診斷 Java 代碼,一個隔周更新的新專欄,它的內容集中在 Java 解決方案上,旨在讓您能夠順利進行日常編程工作。本文為第一篇,介紹了錯誤模式的概念,一個非常有用的概念,它將提高您檢測和修正代碼中錯誤的能力。您會了解到一種最普遍的錯誤模式,這將為您開始識別和避免更高級的錯誤模式奠定基礎。<!----><!----><!----> 正如好的編程技能涉及很多設計模式(您可以在不同的程序上下文中組合和應用這些模式)的知識一樣,好的調試技能也涉及對 錯誤模式 的一定了解。錯誤模式就是已發出的錯誤和程序中潛在的錯誤之間的重復出現的相互關系。這種概念對編程來說并不新鮮。醫生們在診斷疾病時依靠相似類型的相互關系。他們在實習期間通過和資格較老的醫生共同工作來學習這些。他們的教育就是集中在做這種診斷上的。相反,我們軟件工程師的教育是集中在過程設計和算法分析上的。這些技能固然重要,但是人們對調試過程的教育卻很少關注。相反,我們得自己去“拾起”這種技能。隨著極端編程的出現和它對單元測試的注重,這種做法已經開始改變了。但是頻繁的單元測試只是解決了問題的一部分。一旦發現錯誤,就必須診斷和糾正它們。幸運的是,很多錯誤都遵循我們可以識別的幾種錯誤模式的其中一種。一旦您可以識別出這些錯誤模式,您就可以診斷出錯誤的原因并且更快地糾正它了。 錯誤模式與反模式有關,反模式是一次又一次被證明是失敗的公共軟件設計的模式。雖然反模式是設計模式,錯誤模式卻是與編程錯誤相關的錯誤的程序行為的模式。這與設計根本沒有關系,而是與編程和調試過程有關。
為了說明錯誤模式后面的思想,讓我們來考慮一種基本錯誤模式,編程新手(經常還有更高級的程序員)常常會遇到這種錯誤模式。在后面的文章中,我們會談到更高級的錯誤模式。對每一種模式,我會討論將有助于把該模式的錯誤的發生控制到最少的編程原則(并非暗示所有的錯誤都是不遵循編程原則的結果;不管我們遵循多少原則,我們都會犯錯誤)。 為了分類起見,我會使用下面的形式(從醫學上借用一些術語)來概括錯誤模式描述:
也許它是編程新手中最普遍的錯誤模式,起因是復制和粘貼一段代碼到程序的其它部分。有時,復制的一小部分因為功能上需求的略微不同而作了改動。不可避免地,錯誤在一個副本中被修正了,而在另一個副本中沒有被修正,這樣在錯誤癥狀復發時就會讓您很頭疼。盡管大多數程序員很快就熟悉了這種錯誤模式,但他們中很少人采取適當的措施來將這種錯誤的出現控制到最少。您很容易就會偷懶不去思考而簡單地復制您認為已經可以運行的代碼。但是工作效率由于修正代碼而喪失,這是因為不加選擇的復制―粘貼操作很快降低了復制代碼帶來的任何工作效率。 我稱此為 Rogue Tile 模式是因為,一段代碼的各個副本可以被看成是分布在程序中的“tile”。由于不同副本中的代碼出現了差異,副本就變成了“rogue tile”。 這種錯誤的模式的最普遍癥狀是,在您認為已經修正了問題以后,程序還繼續表現出錯誤的行為。 為了理解這種情況發生的原因,我們來看看下面的二元樹類層次結構:
對于這些類要注意的第一件事就是,兩種具體類都包含
當然,這個示例所示的錯誤是編程新手可以很快學會通過分解出公共代碼來避免的。在本例中,字段聲明應該移到
繼續看這個示例,我們可能還會編寫在一個
請注意我在
就象以前一樣,我們可以通過分解出公共代碼來將這種錯誤控制到最少。在這種情況下,我們可以編寫一個單獨的方法,它在
然后我們就可以如下面的代碼所示在我們的
通過分解出公共代碼,我們消除了在
分解出公共代碼是一個很好的習慣,但它并不適用于所有的情況。比如說,Java 類型系統的簡單性經常迫使我們在精確類型檢驗和保持對程序的每個不同的功能性元素的單點控制(請參閱 參考資料 ,閱讀我寫的關于 NextGen 的文章)之間作出選擇。正因為這個,Rogue Tile 模式是所有開發人員必須一直努力以控制到最少的一種錯誤類型。
簡而言之,這是我們的第一個錯誤模式。您可能想把它剪下來釘在您的公告牌上作為提醒。
在我的下一篇文章中,我會探究 Java 代碼中出現過的其它一些普遍的錯誤模式。我們將特別看一下作為空指針異常而出現的錯誤模式,并討論如何將它們的出現次數控制到最少。
|
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
