国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

有效地對(duì)軟件進(jìn)行交互式診斷的技術(shù)和工具

2019-11-18 15:21:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

通常,在運(yùn)行 java 程序時(shí),必須使用 String[] 輸入?yún)?shù)將參數(shù)傳入,從 main() 方法運(yùn)行程序。但是假如程序仍在調(diào)試中,那么,這可能會(huì)成為一項(xiàng)繁重的任務(wù)。本月,Eric Allen 討論對(duì)程序中的表達(dá)式和語(yǔ)句進(jìn)行交互式評(píng)價(jià)的優(yōu)點(diǎn),并且提供幾個(gè)幫助您處理這一任務(wù)的 Java repl(“read-eval-PRint-loop”工具,“讀取-評(píng)價(jià)-打印-循環(huán)”工具)。他還討論交互式評(píng)價(jià)如何幫助構(gòu)建 GUI 和探索新的 API。閱讀本文后,您將理解在預(yù)調(diào)試(pre-debugged)程序中交互地診斷小錯(cuò)誤的做法及原因,您將能夠使用一些 Java 工具來(lái)方便您的工作。請(qǐng)單擊本文頂部或底部的討論在討論論壇與作者及其他讀者共享關(guān)于本文的心得。
多數(shù)程序都包含很多方法,這些方法分布在為數(shù)眾多的類中。毫無(wú)疑問(wèn),從程序的 main 入口點(diǎn)測(cè)試所有這些方法,即使不是不可能的,也是很困難的。

這就是單元測(cè)試之所以有用的原因。許多程序員和軟件設(shè)計(jì)人員(包括我自己)強(qiáng)調(diào)單元測(cè)試在編寫健壯的的軟件時(shí)是有用的。但是假如您想能夠以一種交互性更好的方式訪問(wèn)程序中的各種元素時(shí),則可能要折衷一下。

當(dāng)確實(shí)要這樣做時(shí),為每個(gè)結(jié)果編寫、編譯并運(yùn)行新的單元測(cè)試就會(huì)很快變成一件繁重的事情。我發(fā)現(xiàn),當(dāng)不能預(yù)知給予特定輸入后程序?qū)⒈憩F(xiàn)出什么行為時(shí)(例如:在 AI 程序中可能就會(huì)出現(xiàn)這種情況),尤其如此。

那么,該怎么辦呢?

不要為小改動(dòng)著急
為了作一個(gè)類比,請(qǐng)考慮用通常情況下進(jìn)行編譯的語(yǔ)言(例如:Java 或 C++)編程和用在更多情況下進(jìn)行解釋的語(yǔ)言(Python 或 Scheme)編程之間的差異。

在編譯型語(yǔ)言中,每個(gè)編寫/測(cè)試/調(diào)試循環(huán)都必須包含編譯這一額外的步驟,這可能是一個(gè)單調(diào)乏味的經(jīng)歷,尤其是對(duì)于一些小改動(dòng)而言。這可能會(huì)使我們得出結(jié)論說(shuō),解釋型語(yǔ)言更流暢,因而也更易于修改。(這種靈活性是有代價(jià)的:解釋型語(yǔ)言通常更少對(duì)代碼執(zhí)行靜態(tài)檢查,例如類型檢查。)

正如有時(shí)候我們可能想對(duì)程序作個(gè)改動(dòng),但不必經(jīng)歷重編譯的麻煩一樣,我們也可能想檢查程序中的一些元素,但不必例行公事般在套件中添加一個(gè)新的單元測(cè)試。當(dāng)確實(shí)想這樣做時(shí),擁有傳統(tǒng)上稱為“讀取-評(píng)價(jià)-打印-循環(huán)”(即 repl)的工具可能會(huì)有所幫助。

repl 是一個(gè)基于文本的工具,它以表達(dá)式作為輸入,在特定程序的上下文中進(jìn)行評(píng)端,然后顯示結(jié)果。接著,它等待獲得另一個(gè)表達(dá)式作為輸入,然后重復(fù)這些操作。這樣的工具源于類似 Lisp 的語(yǔ)言,但它們也能在更新的語(yǔ)言(例如:Python)中使用。

repl 在 Java 編程中的好處
這樣的工具并非僅僅在這些語(yǔ)言中是有用的。Java 程序員也可以從使用 repl 中獲得好處,不只是調(diào)試方面,在其它方面也可以。

構(gòu)建 GUI
當(dāng)組裝一個(gè) GUI 時(shí),有許多組件需要布置和連接。當(dāng)構(gòu)造 GUI 時(shí),您肯定會(huì)碰到以下這些事情:

組件之間將以不可見(jiàn)的方式相互作用。

在運(yùn)行 GUI 之前寫出其所有代碼是相當(dāng)費(fèi)時(shí)的。

一旦您看到了 GUI 的實(shí)際視覺(jué)效果,不可避免地,您將會(huì)想更改 GUI 的某些方面。
這個(gè)問(wèn)題的一種常見(jiàn)的“解決方案”是使用圖形化的 GUI 構(gòu)建工具,例如那些包含在 JBuilder、Forte 和其它 IDE 中的 GUI 構(gòu)建工具。我個(gè)人不喜歡這種辦法 ? 您很難知道這個(gè)工具會(huì)給您生成什么樣的 Java 代碼,您也不可能在修改所生成的代碼時(shí)不冒喪失與 GUI 構(gòu)建工具的兼容性的風(fēng)險(xiǎn)(事實(shí)上,有些 IDE 強(qiáng)行禁止您修改機(jī)器生成代碼的任何部分)。

此外,許多這類 GUI 構(gòu)建工具在生成 Java 代碼時(shí)都使用專用 GUI 庫(kù),因而限制了 GUI 的兼容性。

我發(fā)現(xiàn)使用 repl 來(lái)構(gòu)建 GUI 要輕易得多。我完全可以交互地定義每一個(gè) GUI 組件,然后依次顯示它。我能夠馬上修正任何不喜歡的東西。然后,我可以與之交互并將這些組件粘貼到程序中。

探索新 API
使用 Java 語(yǔ)言編程最大的優(yōu)點(diǎn)之一是,有數(shù)量龐大的 API 可以使用,它們可以與一切事物 ? 從數(shù)據(jù)庫(kù)到 Web 服務(wù)到電視 ? 對(duì)接。不過(guò)需要花些時(shí)間學(xué)習(xí) API 的語(yǔ)義。

通常,Javadocs 不會(huì)對(duì) API 的行為的每個(gè)方面都作出明確說(shuō)明。對(duì)付這種窘境的辦法是直接測(cè)試 API,使用 repl 可以使測(cè)試快得多 ? 只要輸入一個(gè)方法調(diào)用看看其結(jié)果就行了!

一個(gè)額外的好處是,使用 repl 測(cè)試 API 還強(qiáng)化了大多數(shù)程序員的主要行為 ? 我們傾向于在實(shí)踐中取得最好的學(xué)習(xí)效果。

Java 編程中可用的 repl
那么,假如 repl 有這么多優(yōu)點(diǎn),下一個(gè)問(wèn)題顯然是 Java 語(yǔ)言可以使用哪些 repl?

Jython
Jython(以前的名稱是 JPython)是 Python 的 Java 編程語(yǔ)言實(shí)現(xiàn)(包含一個(gè) repl)(經(jīng)認(rèn)證,是 100% 純 Java 的)。實(shí)際上,它把 Python 編譯成(有點(diǎn)復(fù)雜)Java 源代碼或直接編譯成字節(jié)碼。

本著 Python 的精神,人們嘗試了各種辦法以提供 Java 和 Jython 之間的無(wú)縫互操作性。Jython 讓您可以訪問(wèn)所有的 Java 標(biāo)準(zhǔn)庫(kù),就似乎您是自然地使用 Java 語(yǔ)言進(jìn)行編程一樣,您也可以訪問(wèn)現(xiàn)有的 Java 類文件。所以您不僅可以將 repl 用來(lái)與標(biāo)準(zhǔn)庫(kù)一起工作,還可以與已經(jīng)編譯成字節(jié)碼的您自己的 Java(或 Jython)類一起工作。

使用 Jython repl 時(shí)的一個(gè)重要注重事項(xiàng)是您在寫 Python 表達(dá)式,而不是 Java 表達(dá)式。其積極的一面是您得到了 Python 在句法方面簡(jiǎn)明而又美麗的優(yōu)點(diǎn)。

例如,假如我想構(gòu)造一個(gè)新的散列表,這個(gè)表將 a 映射到 1、b 映射到 2,c 映射到 3。使用 Jython 我所要寫的只是:

>>> h = {′a′:1, ′b′:2, ′c′:3}

解釋器在每一個(gè)新的輸入行前顯示 >>>。

當(dāng)探索新的 GUI 設(shè)計(jì)時(shí),Jython 句法也有很多優(yōu)點(diǎn)。舉個(gè)例子來(lái)說(shuō),可以將 GUI 元素的各個(gè)域指定為構(gòu)造函數(shù)的要害字參數(shù),就像這樣:

>>> from javax.swing import *
>>> f = JFrame(visible=1)

這個(gè)示例說(shuō)明了 Jython 和 Java 語(yǔ)言的其它一些差異:

導(dǎo)入語(yǔ)句的句法有很大不同。

整型被用來(lái)取代了布爾型(1 是真,0 是假)。
這里是另一個(gè)示例,示例中 Jython 代碼為您節(jié)省了一些輸入,給 GUI 元素添加了動(dòng)作偵聽(tīng)器(action listener)。通常,這樣的偵聽(tīng)器通過(guò)使用命令模式(Command Pattern)被指定為匿名內(nèi)部類的實(shí)例。在 Python(和其它許多“腳本”語(yǔ)言)中,這樣的命令可以通過(guò)使用交互式函數(shù)定義更簡(jiǎn)潔地加以指定。例如,讓我們?cè)谏鲜龅慕换ナ綍?huì)話的基礎(chǔ)上給 JButton 添加一個(gè)簡(jiǎn)單的動(dòng)作偵聽(tīng)器:

>>> def listener(event):
... print ′thank you′
>>>

這是 Jython 中的函數(shù)定義的一個(gè)示例。為了讓我們知道它什么時(shí)候需要一個(gè)語(yǔ)句以便繼續(xù)進(jìn)行,解釋器在下一行打印省略號(hào)(代替脫字符)。這個(gè)函數(shù)只需要一個(gè)參數(shù),并會(huì)將“thank you”打印到標(biāo)準(zhǔn)輸出。我們可以將它用作動(dòng)作偵聽(tīng)器,如下:

>>> panel = JPanel()
>>> panel.add(JButton(′press me′, actionPerformed=listener))
>>> f.getContentPane().add(panel)
>>> f.pack()

現(xiàn)在,我們將有一個(gè)顯示在屏幕上的窗口,這個(gè)窗口有一個(gè)標(biāo)有“press me”的按鈕,按下這個(gè)按鈕后將打印“thank you”到標(biāo)準(zhǔn)輸出。想像一下,假如使用 Java 代碼的話,這將需要多少語(yǔ)句啊。

當(dāng)然,缺點(diǎn)也是有的。例如:

您失去了靜態(tài)類型檢查(盡管按理說(shuō)靜態(tài)檢查在 repl 中沒(méi)有多少價(jià)值)。

因?yàn)槟斎氲?repl 中的表達(dá)式不是 Java 代碼,所以您無(wú)法在轉(zhuǎn)換它們之前將表達(dá)式從 repl 中復(fù)制和粘貼到您的程序中。

當(dāng)與 Java 代碼一起使用 Jython 時(shí),您得承擔(dān)在腦海中同時(shí)處理兩種語(yǔ)言的額外腦力負(fù)擔(dān)(盡管有些人認(rèn)為這樣做很好玩)。
DynamicJava
Java 可以使用的另一個(gè) repl 是 DynamicJava,一個(gè)真正基于 Java(呃,基本上是對(duì)的)的開(kāi)放源代碼的工具,它有一些不同之處:

repl 語(yǔ)言答應(yīng)您不必在聲明變量時(shí)指定變量的靜態(tài)類型。

您不必在語(yǔ)句末尾添加一個(gè)分號(hào)。解釋器也會(huì)返回(隨意地)null 作為語(yǔ)句的評(píng)價(jià)結(jié)果。(假如語(yǔ)句根本不返回值,情況會(huì)好得多。)

不限制您從 repl 內(nèi)訪問(wèn)對(duì)象的私有字段。
對(duì)于初級(jí) Java 程序員,這些不同之處是很重要的,因?yàn)樗鼈兛赡軙?huì)使他們感到很迷惑。更有經(jīng)驗(yàn)的程序員可能會(huì)樂(lè)于見(jiàn)到其中一些寬松的約束。無(wú)論如何,DynamicJava 都是一個(gè)健壯的、非常有用的軟件產(chǎn)品(而且它是免費(fèi)的,這是有幫助的)。

一個(gè)新的 Java IDE

在 Rice 大學(xué)的 JavaPLT 實(shí)驗(yàn)室(由 Robert Cartwright 教授領(lǐng)導(dǎo)),我們最近發(fā)布了 DrJava,一個(gè)新的、開(kāi)放源代碼的、用于 Java 語(yǔ)言的 GPL′d 開(kāi)發(fā)環(huán)境,它包含了 DynamicJava repl 的一個(gè)潔凈(cleaned-up)版本作為內(nèi)置組件。我說(shuō)“潔凈”是因?yàn)槲覀円呀?jīng)隱藏了前面所描述的 DynamicJava 的某些更隨意的功能。

DrJava 項(xiàng)目是一個(gè)極端編程項(xiàng)目,目的是開(kāi)發(fā)供計(jì)算機(jī)科學(xué)低年級(jí)大學(xué)生教學(xué)之用的免費(fèi)的、輕量級(jí)的 Java IDE。盡管這個(gè) IDE 是為大學(xué)生設(shè)計(jì)的,但它的快速開(kāi)發(fā)功能對(duì)所有級(jí)別的開(kāi)發(fā)者都是有用的。DrJava 背后的理念是利用程序員的語(yǔ)言知識(shí)來(lái)提供強(qiáng)大的開(kāi)發(fā)工具,這與某些盡力把程序員和實(shí)際代碼隔離開(kāi)來(lái)的 IDE 不同。

這個(gè) IDE 的一些優(yōu)異特征包括對(duì)注釋和圓括號(hào)匹配的極其精確(比 Emacs 更精確)的突出顯示,以及可單擊的編譯器錯(cuò)誤的源代碼突出顯示。其界面包含幾個(gè)可單擊的選項(xiàng)卡:

Interactions 選項(xiàng)卡答應(yīng)您與 DynamicJava repl 交互,創(chuàng)建新編譯過(guò)的類的實(shí)例,測(cè)試新編譯過(guò)的類。

Compiler Errors 選項(xiàng)卡答應(yīng)您單擊各種編譯器錯(cuò)誤,將光標(biāo)移到編輯面板中出錯(cuò)的源代碼的位置。

Console 選項(xiàng)卡顯示所有發(fā)送到 System.out 和 System.err 的消息。
(這里是 DrJava 的一個(gè)屏幕截圖。)

我們對(duì)這個(gè) IDE 的經(jīng)驗(yàn)是,交互作用窗格答應(yīng)程序員輕易地執(zhí)行復(fù)雜的開(kāi)發(fā)和調(diào)試任務(wù)。跟在其它語(yǔ)言中所表明的一樣,源代碼編輯器和 repl 的結(jié)合構(gòu)成強(qiáng)大的工具。

repl 總結(jié)
希望本部分已經(jīng)指出并演示了一種主要工具,它能讓您交互地對(duì) Java 程序中的表達(dá)式和語(yǔ)句進(jìn)行評(píng)價(jià),而不陷入重編譯的泥沼 ? 這種工具就是“讀取-評(píng)價(jià)-打印-循環(huán)”即 repl 工具。我們還演示了 repl 如何體現(xiàn)它在構(gòu)建 GUI 中的重要性,或者當(dāng)您只是想快速地檢查大量可以使用的 Java API 時(shí),它又是如何體現(xiàn)它的重要性的。

參考資料

通過(guò)單擊本文頂部或底部的討論參加本文的討論論壇。

Jython 2.1 是 Python 高級(jí)別的、動(dòng)態(tài)的、面向?qū)ο蟮膶?shí)現(xiàn),它答應(yīng)您在任何 Java 平臺(tái)上運(yùn)行 Python。(了解關(guān)于其源祖語(yǔ)言 Python 2.2 的更多信息。)

developerWorks linux 專區(qū)上的 Charming Python 專欄的這篇文章,“Inside JPython and Python for .NET”,快速地窺探了一下 JPython 的內(nèi)幕。

另請(qǐng)?jiān)L問(wèn) DynamicJava,一個(gè) Java 源代碼解釋器。

別忘了下載 DrJava,并利用帶有內(nèi)置 repl 的 IDE 的強(qiáng)大功能。

閱讀 Eric Allen 的 Diagnosing Java Code 專欄的所有文章。

請(qǐng)?jiān)?developerWorks Java 技術(shù)專區(qū)查找更多的 Java 參考資料。

關(guān)于作者
Eric Allen 從 Cornell 大學(xué)獲得計(jì)算機(jī)科學(xué)和數(shù)學(xué)的學(xué)士學(xué)位,也是 Rice 大學(xué) Java 編程語(yǔ)言小組的 PhD 研究生。在回 Rice 完成他的學(xué)位學(xué)習(xí)前,Eric 是 Cycorp 公司的主要 Java 軟件開(kāi)發(fā)者。他還在 JavaWorld 上主持了一個(gè)“Java 初學(xué)者”討論論壇。他的研究涉及源代碼和字節(jié)碼級(jí)別上的 Java 語(yǔ)言語(yǔ)義模型和靜態(tài)分析工具的開(kāi)發(fā)。Eric 是針對(duì) NextGen 編程語(yǔ)言的 Rice 的實(shí)驗(yàn)編譯器的主要開(kāi)發(fā)者,NextGen 編程語(yǔ)言是 Java 語(yǔ)言添加了一些語(yǔ)言功能的擴(kuò)展,他還是 DrJava ? 一個(gè)為初學(xué)者設(shè)計(jì)的開(kāi)放源代碼的 Java IDE ? 的項(xiàng)目經(jīng)理。請(qǐng)通過(guò) eallen@cs.rice.edu 與 Eric 聯(lián)系。

--摘自IBM網(wǎng)站
http://www-900.ibm.com/developerWorks/cn/java/j-diag/part22/index.sHtml

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长宁区| 奉节县| 东明县| 北川| 密山市| 林口县| 沁水县| 庄浪县| 阿荣旗| 诸暨市| 靖宇县| 徐汇区| 周至县| 平昌县| 华宁县| 永胜县| 明水县| 玛沁县| 冷水江市| 石泉县| 云霄县| 奎屯市| 永清县| 黄山市| 陆丰市| 深州市| 元朗区| 岢岚县| 栖霞市| 扶沟县| 武功县| 平邑县| 铜鼓县| 聂拉木县| 尚义县| 敦煌市| 拜泉县| 齐河县| 宿州市| 太康县| 佛山市|