級(jí)別:初級(jí)EricE.Allen,軟件工程師,Cycorp,Inc2001年2月19日歡迎光臨診斷Java代碼,一個(gè)隔周更新的新專欄,它的內(nèi)容集中在Java解決方案上,旨在讓您能夠順利進(jìn)行日常編程工作。本文為第一篇,介紹了錯(cuò)誤模式的概念,一個(gè)非常有用的概念,它將提高您檢測(cè)和修正代碼中錯(cuò)誤的能力。您會(huì)了解到一種最普遍的錯(cuò)誤模" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

高質(zhì)量JAVA:錯(cuò)誤模式

系統(tǒng) 2107 0

錯(cuò)誤模式:介紹

診斷和糾正 Java 程序中反復(fù)出現(xiàn)的錯(cuò)誤類型

文檔選項(xiàng)
將打印機(jī)的版面設(shè)置成橫向打印模式

打印本頁(yè)

將此頁(yè)作為電子郵件發(fā)送

將此頁(yè)作為電子郵件發(fā)送

<!----><!----><!---->

級(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ǔ)。
<!----><!----><!---->

錯(cuò)誤模式和它們?yōu)槭裁从杏?

正如好的編程技能涉及很多設(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)。





回頁(yè)首


通過(guò)示例學(xué)習(xí)

為了說(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ò)誤模式描述:

  • 模式名稱
  • 癥狀
  • 起因
  • 治療方法和預(yù)防措施

Rogue Tile 模式

也許它是編程新手中最普遍的錯(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):

                    public abstract class Tree {
}
public class Leaf extends Tree {
 public Object value;
 ...
}
public class Branch extends Tree {
 public Object value;
 public Tree left;
 public Tree right;
 ...
}

                  


對(duì)于這些類要注意的第一件事就是,兩種具體類都包含 Object 類型的 value 字段。如果您決定稍后讓樹包含,比如說(shuō), Interger ,您也許會(huì)忘記更新其中的一個(gè)字段聲明。如果程序的其它部分需要這些字段是 Interger 的話,程序就很可能不會(huì)編譯。您或許記得您改變了其中一個(gè)類的 value 字段的類型,卻忽略了一個(gè)事實(shí),就是您沒(méi)有在其它類中作相應(yīng)的改變。

一些預(yù)防措施

當(dāng)然,這個(gè)示例所示的錯(cuò)誤是編程新手可以很快學(xué)會(huì)通過(guò)分解出公共代碼來(lái)避免的。在本例中,字段聲明應(yīng)該移到 Tree 類中。它的兩個(gè)子類就會(huì)繼承這個(gè)字段,而且對(duì)字段聲明的任何改變都只需要在一個(gè)地方出現(xiàn)。

繼續(xù)看這個(gè)示例,我們可能還會(huì)編寫在一個(gè) Tree 中相加和相乘所有節(jié)點(diǎn)的方法。為了簡(jiǎn)單起見,我將以遞歸的方式來(lái)編寫這些方法。

                    // in class Tree:
 public abstract int add();
 public abstract int multiply();
 // in class Branch:
 public int add() {
  return this.value.intValue() + left.add() + right.add();
 }
 public int multiply() {
  return this.value.intValue() * left.multiply() + right.multiply();
 }
 // in class Leaf:
 public int add() { return this.value.intValue(); }
 public int multiply() { return this.value.intValue(); }

                  

請(qǐng)注意我在 multiply 方法中為 Branch 類引入的錯(cuò)誤:我沒(méi)有用第三項(xiàng)去乘,而是加了它。錯(cuò)誤發(fā)生了,因?yàn)槲彝ㄟ^(guò)復(fù)制 add 方法中的代碼并作輕微(但不完全)的改動(dòng)創(chuàng)建了 multiply 方法。這種錯(cuò)誤非常隱蔽,因?yàn)檎{(diào)用 multiply 方法永遠(yuǎn)不會(huì)發(fā)出錯(cuò)誤信號(hào)。事實(shí)上,在很多情況下,它會(huì)返回一個(gè)看上去完全合理的結(jié)果。

就象以前一樣,我們可以通過(guò)分解出公共代碼來(lái)將這種錯(cuò)誤控制到最少。在這種情況下,我們可以編寫一個(gè)單獨(dú)的方法,它在 Tree 上累計(jì)一個(gè)運(yùn)算符(作為一個(gè)參數(shù)傳送)。我們可以使用一種被稱為公共模式的設(shè)計(jì)模式(不是錯(cuò)誤模式!)在對(duì)象中封裝這個(gè)運(yùn)算符。

                    public abstract class Operator {
 public abstract int apply(int l, int r);
}
public class Adder extends Operator {
 public int apply(int l, int r) {
   return l + r;
 }
}
public class Multiplier extends Operator {
 public int apply(int l, int r) {
   return l * r;
 }
}

                  

然后我們就可以如下面的代碼所示在我們的 Tree 類層次結(jié)構(gòu)中改變這個(gè)方法:

                    // in class Tree:
 public abstract int accumulate(Operator o);
 public int add() {
   return this.accumulate(new Adder());
 }
 public int multiply() {
   return this.accumulate(new Multiplier());
 }
 // in  class Leaf:
 public int accumulate(Operator o) {
   return value.intValue();
 }
in class Branch: 
 public int accumulate(Operator o) {
   return o.apply(this.value.intValue(),
                  o.apply(left.accumulate(o),
                         right.accumulate(o)));
 }

                  

通過(guò)分解出公共代碼,我們消除了在 add multiply 方法正文中出現(xiàn)復(fù)制―粘貼錯(cuò)誤的可能性。另外,請(qǐng)注意我們不再需要為 Tree 的每一個(gè)子類編寫單獨(dú)的 add multiply 方法了。

分解出公共代碼是一個(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ò)誤類型。





回頁(yè)首


下一篇內(nèi)容是什么?

簡(jiǎn)而言之,這是我們的第一個(gè)錯(cuò)誤模式。您可能想把它剪下來(lái)釘在您的公告牌上作為提醒。

  • 模式:Rogue Tile
  • 癥狀:代碼好像表現(xiàn)出前面糾正過(guò)的錯(cuò)誤依然存在。
  • 起因:復(fù)制―粘貼代碼片段的至少一個(gè)副本還包含在其它副本中已經(jīng)修正了的錯(cuò)誤。
  • 治療和預(yù)防措施:如果可能,分解出公共代碼;否則就對(duì)其進(jìn)行更新。避免復(fù)制和粘貼代碼。

在我的下一篇文章中,我會(huì)探究 Java 代碼中出現(xiàn)過(guò)的其它一些普遍的錯(cuò)誤模式。我們將特別看一下作為空指針異常而出現(xiàn)的錯(cuò)誤模式,并討論如何將它們的出現(xiàn)次數(shù)控制到最少。



參考資料

  • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文 .

  • 訪問(wèn) 模式主頁(yè) ,這是一個(gè)介紹設(shè)計(jì)模式以及如何使用它們的優(yōu)秀主頁(yè)。

  • 反模式主頁(yè) 提供了關(guān)于該主題的書籍的信息和鏈接。

  • 如果您還沒(méi)有這么做,請(qǐng)查閱 極端編程 ,一個(gè)快速開發(fā)簡(jiǎn)潔的、健壯的軟件的強(qiáng)大的新方法。

  • 然后下載 JUnit 并立刻開始單元測(cè)試。

  • Eric Allen 的關(guān)于 NextGen (Java 的一個(gè)運(yùn)行時(shí)泛型類型的擴(kuò)展)的文章說(shuō)明了一個(gè)更加強(qiáng)大的類型系統(tǒng)是怎樣幫助減輕存在于分解公共代碼和使用類型系統(tǒng)在編譯期間捕捉錯(cuò)誤的兩個(gè)目標(biāo)之間的一些壓力的。


關(guān)于作者

?

Eric Allen 在 Cornell 大學(xué)獲得計(jì)算機(jī)科學(xué)和數(shù)學(xué)的學(xué)士學(xué)位。他目前是 Cycorp 公司的 Java 軟件開發(fā)人員帶頭人,還是 Rice 大學(xué)的編程語(yǔ)言小組的半工半讀碩士生。他的研究涉及正規(guī)語(yǔ)義模型和 Java 語(yǔ)言的擴(kuò)展,都是在源代碼和字節(jié)碼的級(jí)別上的。目前,他正在為 NextGen 編程語(yǔ)言實(shí)現(xiàn)一種從源代碼到字節(jié)碼的編譯器,這也是 Java 語(yǔ)言的泛型運(yùn)行時(shí)類型的一種擴(kuò)展。

高質(zhì)量JAVA:錯(cuò)誤模式


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 青草在线观看 | 一区二区三区四区在线 | 亚洲一区免费看 | 国产成久久免费精品AV片天堂 | 欧美特黄a级高清免费大片 精品日本三级在线观看视频 | 欧美福利视频在线观看 | 国产目拍亚洲精品区一区 | 日本福利视频 | 一级黄色片毛片 | 亚洲热久久 | 午夜免费电影院 | 国产精品一区久久久 | 久久久久草 | 五月婷婷色综合 | 亚洲狠狠婷婷综合久久久久图片 | 极品一级片 | 在线观看国产 | 国产日韩欧美在线观看 | 日韩精品专区在线影院重磅 | 欧洲一级鲁丝片免费 | 看黄色一级视频 | 色婷婷五 | 免费啪视频在线观看免费的 | 狠狠色欧美亚洲狠狠色五 | 欧美精品一区三区 | 亚洲欧美视频 | 色爱区综合 | 日韩 欧美 国产 师生 制服 | 五月色开心婷婷丁香在线 | 欧美三级不卡 | www.alijizz.info | 日日操视频| 一级毛片在线完整免费观看 | 国产一级一级一级成人毛片 | 97国内精品久久久久久久影视 | 亚洲国产精品久久久久久网站 | 国产拍视频 | 黄色免费一级播放片 | 午夜色大片在线观看 | 国产三级在线视频播放线 | 国产探花在线精品一区二区 |