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

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