2005 年 12 月 08 日
本文介紹如何使用 Eclipse 插件 Ruby Development Tools(RDT),這個(gè)插件使 Eclipse 能夠成為一流的 Ruby 開(kāi)發(fā)環(huán)境。那些希望利用 Eclipse 社區(qū)豐富的基礎(chǔ)設(shè)施來(lái)支持開(kāi)發(fā)的 Ruby 開(kāi)發(fā)人員會(huì)從本文中受益,對(duì)有興趣使用 Ruby 的 Java? 開(kāi)發(fā)人員也會(huì)有所收獲。
為什么要使用 Ruby?
為什么 Java 開(kāi)發(fā)人員會(huì)關(guān)心 Ruby?Ruby 是 10 年前在日本開(kāi)發(fā)出來(lái)的通用腳本語(yǔ)言。與流行的信念相反,它是一種純面向?qū)ο笳Z(yǔ)言。與 Java 技術(shù)不同,Ruby 沒(méi)有標(biāo)量,所以所有東西(包括整數(shù))都是一類對(duì)象。Ruby 的語(yǔ)法很大程度上借鑒于 Smalltalk、Python 和 Ada。與 Java 語(yǔ)言相同的地方是,Ruby 也是一種單繼承語(yǔ)言,但是它提供了 Java 技術(shù)所缺乏的某些高級(jí)特性,比如閉包(與 steroids 上的匿名內(nèi)部類相似)和 mix-ins(與接口相似,但是它們與類的綁定不太緊密)。Ruby 也具有很高的可移植性,可以在所有主流操作系統(tǒng)上運(yùn)行。
Ruby 現(xiàn)在已經(jīng)很流行了,人們開(kāi)始用它建立各種應(yīng)用程序。因?yàn)樗墙忉屨Z(yǔ)言而且使用動(dòng)態(tài)類型,所以可以在運(yùn)行時(shí)做許多極其靈活的工作,而這在 Java 中是非常困難的。動(dòng)態(tài)類型和表達(dá)語(yǔ)法所支持的神奇功能之一是,能夠在 Ruby 中創(chuàng)建領(lǐng)域特定的語(yǔ)言,這使開(kāi)發(fā)人員能夠在更高的抽象級(jí)別上工作,從而脫離語(yǔ)言的“原始”語(yǔ)法。Ruby on Rails 是一個(gè)用于創(chuàng)建帶后端數(shù)據(jù)庫(kù)的 Web 應(yīng)用程序的框架,它展示了這種優(yōu)雅性。Rake(Make 和 Ant 相結(jié)合的 Ruby 版本)也展示了 Ruby 的這種強(qiáng)大能力。
使用 Ruby 的另一個(gè)理由是,許多敏銳的開(kāi)發(fā)人員已經(jīng)開(kāi)始使用它了。那些在 1996 年就認(rèn)識(shí)到 Java 技術(shù)即將流行的開(kāi)發(fā)人員(比如 Glenn Vanderburg、Bruce Tate 和 Martin Fowler)現(xiàn)在已經(jīng)開(kāi)始使用 Ruby。即使您還不打算全面轉(zhuǎn)向 Ruby,現(xiàn)在也應(yīng)該研究一下這種語(yǔ)言了。
對(duì)于用 Ruby 進(jìn)行廣泛的開(kāi)發(fā),主要的限制因素之一是缺少一個(gè)出色的開(kāi)發(fā)環(huán)境(對(duì)于那些不想學(xué)習(xí) Emacs 的人來(lái)說(shuō)尤其如此)。RDT 改變了這種狀況。在您喜歡的 Eclipse IDE 中使用 Ruby,這會(huì)使您感到舒適。
準(zhǔn)備
在開(kāi)始使用 Ruby 之前,必須安裝(或者驗(yàn)證已經(jīng)具有了) Ruby 解釋器和庫(kù)以及 Ruby Development Environment。
獲得 Ruby
可以獲得適合所有主流平臺(tái)以及幾個(gè)次要平臺(tái)的 Ruby 版本。實(shí)際上,您的 Linux? 或 Cygwin 發(fā)行版可能已經(jīng)包含了 Ruby。轉(zhuǎn)到命令提示符下并輸入 ruby -v 。
如果看到一個(gè)版本號(hào),就說(shuō)明 Ruby 已經(jīng)有了。如果沒(méi)有看到版本號(hào),就需要獲取 Ruby。先尋找適合您平臺(tái)的 發(fā)行版。
如果您正在使用 Windows?,就更容易了。RubyForge(與 SourceForge 功能相似)有一個(gè)稱為 One-Click Ruby Installer 的項(xiàng)目,這個(gè)程序會(huì)在 Windows 上建立 Ruby 環(huán)境(參閱 參考資料)。它還包含幾個(gè)工具,包括稱為 FreeRide 的 IDE,但是如果使用 RDT,則可以不用理會(huì)大多數(shù)這些工具。
獲得文檔
在開(kāi)始使用一種新語(yǔ)言時(shí),文檔和其他參考資料是非常重要的??梢栽?Ruby 主 Web 站點(diǎn)上獲得 Ruby 文檔的在線參考,但是您會(huì)發(fā)現(xiàn)這里的文檔有點(diǎn)兒過(guò)時(shí)了(它針對(duì) Ruby V1.6,而當(dāng)前版本是 1.8.2)。這是因?yàn)樽钚碌奈臋n還沒(méi)有從日文翻譯成英文。但是在 Ruby-doc.org 上可以找到最新的文檔。它包含 API 級(jí)文檔(與 Javadoc 等同)以及一些教程和書(shū)籍。(參閱 參考資料。)
如果您關(guān)心 Ruby 開(kāi)發(fā),那么應(yīng)該盡快獲得 Dave Thomas 和 Andy Hunt 撰寫(xiě)的 Programming Ruby: The Pragmatic Programmer‘s Guide(參閱 參考資料)。這是對(duì) Ruby 的標(biāo)準(zhǔn)介紹并且介紹了 Ruby 庫(kù)的需求。在閱讀這本書(shū)的同時(shí),還可以閱讀 Dave Thomas 撰寫(xiě)的 Agile Development with Ruby on Rails,其中介紹了 Ruby on Rails。
獲得 RDT
既然已經(jīng)在計(jì)算機(jī)上安裝了可以工作的 Ruby 版本并且獲得了文檔,現(xiàn)在就需要 RDT 了(參閱 參考資料)。這個(gè) Eclipse 插件提供了許多特性,您在編輯代碼時(shí)會(huì)慢慢熟悉這些特性。RDT 是一個(gè)標(biāo)準(zhǔn)的 Eclipse 插件,具有特性和插件,所以可以將 zip 文件直接解壓縮到 Eclipse 文件夾。存檔文件中的路徑會(huì)建立目錄結(jié)構(gòu)。
現(xiàn)在可以創(chuàng)建 Ruby 項(xiàng)目了(參見(jiàn)圖 1):
圖 1. 創(chuàng)建新的 Ruby 項(xiàng)目
與 Java 技術(shù)相比,Ruby 對(duì)名稱和目錄結(jié)構(gòu)的要求寬松多了。在 Ruby 中創(chuàng)建一個(gè)項(xiàng)目實(shí)際上只是創(chuàng)建一個(gè)目錄和一個(gè) .project 文件(這里不需要 .classpath 文件,因?yàn)?Ruby 沒(méi)有類路徑)。與 Java 技術(shù)相比,另一個(gè)顯著差異是 Ruby 項(xiàng)目向?qū)Р⒉粍?chuàng)建顯式的 src 和 bin 目錄。Ruby 是解釋語(yǔ)言,所以沒(méi)有輸出文件夾。如果項(xiàng)目比較小,那么可以將 Ruby 源代碼文件與項(xiàng)目文件放在同一個(gè)文件夾中。也可以創(chuàng)建自己的目錄結(jié)構(gòu)。您會(huì)發(fā)現(xiàn),與 Java 語(yǔ)言相比,Ruby 不太關(guān)心目錄結(jié)構(gòu)。
接下來(lái),需要一個(gè) Ruby 源代碼文件。沒(méi)有專門(mén)用于創(chuàng)建 Ruby 源代碼文件的向?qū)?。與 Java 技術(shù)不同,對(duì)于 Ruby 源代碼文件的結(jié)構(gòu)沒(méi)有什么要求,所以要?jiǎng)?chuàng)建 Ruby 文件,只需使用項(xiàng)目的右擊菜單創(chuàng)建一個(gè)新文件。
圖 2. 創(chuàng)建 Ruby 源代碼文件
不要忘記在文件名后面加上標(biāo)準(zhǔn)的擴(kuò)展名 .rb ,這是一般的 Ruby 擴(kuò)展名。創(chuàng)建 Ruby 文件應(yīng)該會(huì)打開(kāi) Ruby 透視圖。
圖 3. 創(chuàng)建 Ruby 源代碼文件會(huì)打開(kāi) Ruby 透視圖
Ruby 透視圖還提供一個(gè)大綱視圖,這與 Java 透視圖提供的大綱視圖相似。與 Java 大綱視圖相似,它允許導(dǎo)航 Ruby 源代碼文件的元素。在圖 4 中,raise_salary_by 方法在大綱視圖和源代碼視圖中高亮顯示。
圖 4. 大綱視圖允許在源代碼文件中進(jìn)行導(dǎo)航
與其他復(fù)雜的插件一樣,RDT 也在 Window > Preferences 對(duì)話框中增加了定制特性。這個(gè)首選項(xiàng)對(duì)話框如圖 5 所示。
圖 5. RDT 的定制首選項(xiàng)
首選項(xiàng)菜單項(xiàng)允許修改語(yǔ)法高亮顯示方式、格式化(在 Ruby 中標(biāo)準(zhǔn)的縮進(jìn)是兩個(gè)空格,不是四個(gè),所以要做某些調(diào)整)等等。它還允許定制編輯器模板以及選擇解釋器。
RDT 編輯器
在 Java 技術(shù)環(huán)境中,我們已經(jīng)習(xí)慣了高級(jí)的編輯器特性,這使我們?cè)谵D(zhuǎn)移到?jīng)]有提供這些特性的其他環(huán)境時(shí)不太適應(yīng)。Ruby IDE 缺乏的特性之一是 Content Assist,這種特性針對(duì)標(biāo)識(shí)符進(jìn)行上下文相關(guān)的查找。RDT 編輯器對(duì) Ruby 代碼提供了 Content Assist。
圖 6. RDT 編輯器提供 Content Assist
RDT 編輯器中的 Content Assist 沒(méi)有 Java 環(huán)境中那么有針對(duì)性,因?yàn)?Ruby 支持動(dòng)態(tài)類型。在 Ruby 中,不能將類型賦給變量或者方法返回值。標(biāo)識(shí)符上下文在運(yùn)行時(shí)決定類型。Ruby 使用所謂的“duck typing” —— 也就是說(shuō),如果它接受“鴨叫”消息,那么它一定是鴨子。對(duì)于那些習(xí)慣于強(qiáng)類型語(yǔ)言的人來(lái)說(shuō),這可能像是一種阻礙,但是這種弱類型耦合使 Ruby 語(yǔ)言能夠?qū)崿F(xiàn)某些更強(qiáng)大的特性。例如,在 Ruby 中可以編寫(xiě)一個(gè)異常處理程序,如果調(diào)用一個(gè)不存在的方法就會(huì)觸發(fā)這個(gè)程序,這個(gè)異常處理程序可以動(dòng)態(tài)地合成這個(gè)方法并且調(diào)用它。在強(qiáng)類型語(yǔ)言中很難實(shí)現(xiàn)這種元編程。
Content Assist 彌補(bǔ)的特性之一是 Ruby 對(duì)標(biāo)識(shí)符使用的特殊命名約定。例如,在 Ruby 中,所有成員變量在第一次使用時(shí)才存在,而且都由 @ 符號(hào)作為名稱的第一個(gè)字符。如果使用 Content Assist 查找成員變量,那么可以輸入 @ ,并且只看到成員變量。
圖 7. Ruby 中的命名約定幫助實(shí)現(xiàn) Content Assist
動(dòng)態(tài)類型仍然會(huì)妨礙 Ruby 中的上下文敏感性。在圖 7 中,合法的成員變量只是在上面方法聲明中出現(xiàn)的成員變量,即 @name 、@salary 和 @hire_year 。Content Assist 挑選出的其他成員變量來(lái)自后面定義的另一個(gè)類。RDT 編輯器還不完善,無(wú)法過(guò)濾出所有語(yǔ)法上正確但是語(yǔ)義上不正確的條目。
運(yùn)行和調(diào)試
IDE 的關(guān)鍵特性之一是能夠在構(gòu)建應(yīng)用程序的環(huán)境中對(duì)應(yīng)用程序進(jìn)行運(yùn)行和調(diào)試。RDT 支持這兩種功能。
指定解釋器
Ruby 是一種解釋語(yǔ)言,所以必須將一種解釋器與環(huán)境相關(guān)聯(lián),然后 RDT 才能運(yùn)行或調(diào)試應(yīng)用程序。這種關(guān)聯(lián)是在 Windows > Preferences 對(duì)話框中 Ruby 標(biāo)題下面的 Installed Interpreters 項(xiàng)中設(shè)置的。
圖 8. 將 Ruby 解釋器與環(huán)境關(guān)聯(lián)起來(lái)
將“Location”文本域指向您使用的 Ruby 版本的 bin 目錄。RDT 會(huì)找到所需的其他信息。關(guān)聯(lián)了解釋器之后,就可以運(yùn)行應(yīng)用程序了。
運(yùn)行 Ruby 應(yīng)用程序
運(yùn)行 Ruby 應(yīng)用程序與運(yùn)行 Java 應(yīng)用程序?qū)嶋H上完全一樣。使用 Run 菜單創(chuàng)建一個(gè) Run 配置。
圖 9. 在 RDT 中建立 Run 配置
在運(yùn)行應(yīng)用程序時(shí),RDT 啟動(dòng) Ruby 解釋器并且在 Eclipse 工作區(qū)底部的一個(gè)控制臺(tái)窗口中運(yùn)行這個(gè)應(yīng)用程序。
圖 10. 在 RDT 中運(yùn)行 Ruby 應(yīng)用程序
這個(gè)例子顯示如何運(yùn)行一個(gè)控制臺(tái)應(yīng)用程序,但是運(yùn)行其他類型的應(yīng)用程序(比如圖形化應(yīng)用程序)也是一樣的。
用 RDT 進(jìn)行調(diào)試
IDE 需要的最關(guān)鍵的特性之一是能夠有效地調(diào)試應(yīng)用程序。Ruby 解釋器包含一個(gè)命令行調(diào)試器,但是在這個(gè)圖形化工具的時(shí)代誰(shuí)還想使用命令行調(diào)試器?幸運(yùn)的是,Ruby 解釋器還通過(guò)一個(gè)特定(可配置)的端口廣播調(diào)試信息,RDT 這樣的工具能夠監(jiān)聽(tīng)這個(gè)端口并且提供開(kāi)發(fā)人員期望的調(diào)試支持類型。
要調(diào)試 Ruby 應(yīng)用程序,需要?jiǎng)?chuàng)建一個(gè) Debug 配置,就像前面創(chuàng)建 Run 配置一樣。然后,在左邊的空白處點(diǎn)擊以設(shè)置斷點(diǎn),并使用調(diào)試器啟動(dòng)應(yīng)用程序。與 Java 技術(shù)一樣,IDE 將詢問(wèn)您是否想切換到 Debug 透視圖?;卮鹬?,將看到下面這樣的屏幕:
圖 11. 在 RDT 中調(diào)試 Ruby 應(yīng)用程序
RDT 提供了與 Java 技術(shù)相同的調(diào)試支持級(jí)別。左上方的窗格顯示當(dāng)前正在執(zhí)行的線程。右上方的窗格顯示變量的值。與 Java 語(yǔ)言中一樣,可以深入到對(duì)象中,查看它們的底層成員變量值。左邊中間的窗格顯示正在運(yùn)行的應(yīng)用程序的源代碼,右邊中間的窗格顯示大綱視圖(它在這里的工作方式與在編輯器中一樣,讓開(kāi)發(fā)人員能夠通過(guò)點(diǎn)擊標(biāo)識(shí)符來(lái)進(jìn)行導(dǎo)航)。Debug 窗口的底部顯示 Ruby 解釋器在端口 1098 上廣播調(diào)試信息,RDT 在這個(gè)端口上監(jiān)聽(tīng)調(diào)試信息。
調(diào)試支持是 RDT 的關(guān)鍵特性。即使您的編輯器有出色的 Ruby 支持,但是仍然必須依賴命令行調(diào)試器來(lái)調(diào)試應(yīng)用程序。擁有一個(gè)功能全面的調(diào)試器可以顯著提高生產(chǎn)效率。
測(cè)試
對(duì)于 Java 開(kāi)發(fā)人員,Ruby 最難掌握的特性之一是動(dòng)態(tài)類型。如果您已經(jīng)習(xí)慣了強(qiáng)類型語(yǔ)言,那么動(dòng)態(tài)類型看起來(lái)可能會(huì)導(dǎo)致混亂。動(dòng)態(tài)類型支持所有高級(jí)的元編程技巧,這在強(qiáng)類型語(yǔ)言中是很難實(shí)現(xiàn)的,甚至不可能。當(dāng)然,還會(huì)失去編譯時(shí)檢查的安全保障。是否有辦法同時(shí)獲得這兩種環(huán)境的優(yōu)勢(shì)呢?
對(duì)于語(yǔ)言,單元測(cè)試是必需的,但是在動(dòng)態(tài)語(yǔ)言中它特別重要。單元測(cè)試能夠比單純編譯揭示出更多的問(wèn)題。實(shí)際上,您應(yīng)該換個(gè)角度看待單元測(cè)試和編譯之間的關(guān)系。近來(lái),在一個(gè)軟件開(kāi)發(fā)專家討論會(huì)上,軟件開(kāi)發(fā)思想家 Relevance 公司的 Stuart Halloway 指出,“在 5 年內(nèi),我們將看到編譯成為一種比較弱的單元測(cè)試形式?!眴卧獪y(cè)試檢驗(yàn)代碼是否做了開(kāi)發(fā)人員希望它做的事兒,而不只是對(duì)類型進(jìn)行拼寫(xiě)檢查。
既然單元測(cè)試在 Ruby 環(huán)境中如此重要,那么當(dāng)然希望 RDT 可以使運(yùn)行單元測(cè)試更容易。它確實(shí)做到了。單元測(cè)試已經(jīng)包含在 Ruby 中,所以不需要下載任何額外的擴(kuò)展代碼。Ruby 庫(kù)包含一個(gè) TestCase 類和 TestSuite 的概念。可以像創(chuàng)建其他 Ruby 類一樣創(chuàng)建單元測(cè)試,這需要對(duì) Test::Unit::TestCase 進(jìn)行子類化。清單 1 是一個(gè)稱為 Employee 的示例類。
清單 1. Employee 類
class Employee
def initialize(name, salary, hire_year)
@name = name
@salary = salary
@hire_year = hire_year
end
attr_reader :name, :salary, :hire_year
def raise_salary_by(perc)
@salary += (@salary * (perc * 0.01))
end
def to_s
"Name is #{@name}, salary is #{@salary}, " +
"hire year is #{@hire_year}"
end
end
|
對(duì)應(yīng)的單元測(cè)試是:
清單 2. Employee 類的單元測(cè)試
require ‘test/unit/testcase‘
require ‘test/unit/autorunner‘
require ‘hr‘
class TestEmployee < Test::Unit::TestCase
@@Test_Salary = 2500
def setup
@emp = Employee.new("Homer", @@Test_Salary, 2003)
end
def test_raise_salary
@emp.raise_salary_by(10)
expected = (@@Test_Salary * 0.10) + @@Test_Salary
assert( expected == @emp.salary)
end
end
|
要運(yùn)行這個(gè)單元測(cè)試,應(yīng)該為單元測(cè)試類創(chuàng)建一個(gè) Test::Unit 類型的 Run 配置。
圖 12. RDT 包含 Test::Unit Run 配置
在運(yùn)行這個(gè)測(cè)試時(shí),可以獲得與 Java 單元測(cè)試相同的支持元素,包括左下角與 JUnit 相似的面板。
圖 13. 在 IDE 中運(yùn)行的單元測(cè)試示例
在 Ruby 中還可以創(chuàng)建 TestSuites。TestSuites 是定義套件方法的 Ruby 類,這個(gè)方法返回 TestSuite。TestSuite 由在每個(gè) TestCases 中自動(dòng)定義的套件組成。清單 3 是兩個(gè)類的 TestSuite 示例。
清單 3. 兩個(gè)類的 TestSuite 示例
require ‘test/unit/testsuite‘
require ‘test/unit/ui/tk/testrunner‘
require ‘test/unit/ui/console/testrunner‘
require ‘TestEmployee‘
require ‘TestManager‘
class TestSuite_AllTests
def self.suite
suite = Test::Unit::TestSuite.new("HR Tests")
suite << TestEmployee.suite
suite << TestManager.suite
return suite
end
end
#Test::Unit::UI::Tk::TestRunner.run(TestSuite_AllTests)
Test::Unit::UI::Console::TestRunner.run(TestSuite_AllTests)
|
與前面運(yùn)行單一 TestCase 的例子不同,套件作為單獨(dú)的應(yīng)用程序運(yùn)行。Ruby 有兩種顯示 TestSuite 結(jié)果的方法。第一種是 Console Test Runner,它在控制臺(tái)輸出結(jié)果。第二種是 Tk TestRunner,它創(chuàng)建一個(gè)對(duì)話框來(lái)顯示測(cè)試結(jié)果。Tk TestSuite 對(duì)話框見(jiàn)圖 14。
圖 14. 圖形化的 TestSuite 對(duì)話框
未來(lái)的發(fā)展
RDT 的當(dāng)前版本是 0.50。它的開(kāi)發(fā)人員正在為下一個(gè)版本 0.60 而努力。下一個(gè)版本中計(jì)劃的改進(jìn)包括:
- 代碼折疊 —— 可以將類和方法的代碼折疊起來(lái)。
- 大綱視圖 —— 更詳細(xì),支持局部變量。
- RI 視圖 —— 從 一個(gè) RDT 視圖使用 Ruby 的 ri 實(shí)用程序。
- 任務(wù)標(biāo)記 —— 在 Ruby 注釋中為可配置的關(guān)鍵字(比如 TODO、FIXME)創(chuàng)建任務(wù)。
- 編輯器改進(jìn) —— 自動(dòng)補(bǔ)齊方括號(hào)、圓括號(hào)和單/雙引號(hào);更好的代碼輔助。
- 審查的快捷方式 —— 對(duì) Debug 會(huì)話期間經(jīng)常使用的審查提供可配置的快捷方式,比如顯示對(duì)象的所有方法、全局變量,等等。
下一個(gè)版本將更好地使用 JRuby 字節(jié)碼編譯器。JRuby 項(xiàng)目可以將 Ruby 代碼編譯為 Java 字節(jié)碼。這意味著 RDT 的下一版本將更容易集成到 Eclipse 環(huán)境中,提供更好的支持。
結(jié)束語(yǔ)
Pragmatic Programmer: From Journeyman to Master 一書(shū)中最出色的建議之一是:您應(yīng)該每年學(xué)習(xí)一種新的編程語(yǔ)言從而跟上潮流,并且通過(guò)新語(yǔ)言學(xué)習(xí)一些新知識(shí)。Ruby 就快要廣泛流行了,這在某種程度上是由于 Ruby on Rails 項(xiàng)目獲得了成功。到了將 Ruby 加進(jìn)您的工具庫(kù)的時(shí)候了。RDT 是您掌握 Ruby 的好幫手。
參考資料
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
- 獲得 Ruby Development Tools,這個(gè) Eclipse 插件添加了 Ruby 支持,包括 Content Assist、調(diào)試和單元測(cè)試支持。
- 可以從 Rubyforge.org 獲得 Rake,這是 Ruby 的構(gòu)建工具。Rake 提供一種用于執(zhí)行構(gòu)建的語(yǔ)言,提供了 Make 和 Ant 兩者的優(yōu)秀特性。它還展示了 Ruby 靈活的語(yǔ)法如何輕松地創(chuàng)建具有高度針對(duì)性的領(lǐng)域?qū)S谜Z(yǔ)言。
- 使用 IBM 試用版軟件 改進(jìn)您的下一個(gè)開(kāi)放源碼開(kāi)發(fā)項(xiàng)目,這些軟件可以下載或者通過(guò) DVD 獲得。
討論
關(guān)于作者
|
|
|
Neal Ford 是 ThoughtWorks 的應(yīng)用架構(gòu)師,這是一家 IT 專業(yè)服務(wù)公司,它網(wǎng)羅了世界各地的天才,致力于從軟件中獲得更多價(jià)值。他是許多應(yīng)用、教學(xué)資料、雜志文章、課件、視頻/DVD 演示的設(shè)計(jì)者和開(kāi)發(fā)人員,還是 Developing with Delphi: Object-Oriented Techniques、JBuilder 3 Unleashed 和 Art of Java Web Development 等書(shū)籍的作者。他主要關(guān)注的領(lǐng)域是大規(guī)模企業(yè)應(yīng)用程序的構(gòu)建。他還是在國(guó)際上受歡迎的演講者,曾經(jīng)在世界各地的許多開(kāi)發(fā)人員會(huì)議上發(fā)言。他歡迎您通過(guò) neal.ford@gmail.com 與他聯(lián)系。
|
|