使用Eclipse+RDT插件進行Ruby開發

http://blog.cnlidc.com/?p=124

一、 爲什麼使用Ruby?

  現在,爲什麼衆多的Java開發者都關注Ruby?Ruby,是10年以前在日本創建的一種通用目的腳本語言,這是一種純面向對象的語言。不同於 Java技術,Ruby中的一切都是對象。Ruby的語法主要來源於Smalltalk,Python和Ada。象Java編程語言一樣,Ruby是一種 單繼承的語言,但是它提供了一些Java技術所沒有實現的高級特徵,例如閉合(可以認爲是一種匿名的內部類)和mix-in(類似於接口,但是較松地綁定 於類上)。Ruby也是高度可移植的,能夠運行在所有主流的操作系統之上。

  現在,Ruby正十分熱門。人們正在開始把它應用於各種類型的應用程序。因爲它是解釋型並且使用動態類型化,所以你可以在運行時刻實現在Java中很 難實現的技巧。由動態類型化和富於表達的語法所實現的令人喫驚的能力之一是它能夠用Ruby創建域特定的語言(DSL)-它們允許你在更高級別的抽象層上 工作,從而遠離最原始的語言語法。Ruby onRails是一種創建基於數據庫支持的Web應用程序的框架,這也展示了Ruby的力量。Rake,作爲Ruby的Make和Ant合二爲一的版本, 是這種語言強有力的應用的又一個證明。

  使用Ruby的另一個原因是,所有的編程發燒友都在使用它。現在,許多Java高手(如Glenn Vanderburg,Bruce Tate和Martin Fowler)都在使用Ruby。即使你不打算把你的所有開發轉向Ruby,這種語言也值得你瀏覽一番。

  限制Ruby發展的主要因素之一是,它缺乏一個良好的開發環境(對於那些不想學習Emacs的用戶來說)。如今,RDT改變了這一切,而使用Eclipse對此進行試驗則最好不過。

  二、 安裝

  在使用Ruby之前,你必須安裝Ruby解釋器,相應的庫和Ruby開發環境。

  三、 取得Ruby

  Ruby可用於所有主要的平臺上。事實上,你的Linux或Cygwin分發包中可能已經包含了它。請打開一個命令提示符,然後輸入"Ruby-v"。
如果你得到一個版本號,那麼你已經準備好。否則,你需要檢查你所選擇的平臺的分發包。

  如果你正在運行Windows,則選擇更容易。RubyForge,作爲SourceForge上的Ruby特定的等價物,有一個工程稱爲One- Click RubyInstaller,這個程序用於在Windows平臺上搭建Ruby環境。它還包括另外一些工具,如一個稱爲FreeRide的IDE;但是如 果你使用RDT的話,你在安裝過程中可以跳過這些這項。

  四、 取得文檔

  當你開始使用一種新語言時,文檔及有關參考材料是至關重要的。你可以在主Ruby網站得到Ruby文檔的在線參考材料,但是你會發現這些文檔有點過時 (它們是針對於Ruby1.6版本的,而當前版本是1.8.2)。問題是,更新的文檔目前還沒有從日語翻譯過來。然而,你可以在Ruby-doc.org 上找到最新的幫助文檔。它包括API級的文檔(Javadoc的等價物),還有其它一些教程和書籍。

  如果你是一位嚴肅的Ruby開發者,那麼你應該閱讀一下《Programming Ruby:The Pragmatic Programmer's Guide》(作者是Dave Thomas和AndyHunt)一書以取得最佳編程效果。這是一本有關Ruby及Ruby庫編程的經典指南。如果你得到此書,那麼你還可以參考也是 DaveThomas編寫的《Agile Development with Ruby on Rails》一書。這是一本有關Ruby onRails的入門性書籍。

  五、 得到RDT

  現在,既然你在自己的計算機上安裝了一個可工作的具有良好幫助文檔的Ruby,那麼接下來你需要安裝RDT了。這是一個Eclipse插件,它提供了 許多你可能在編輯代碼時已習慣的特徵。RDT是一個標準的Eclipse插件;因此,你可以直接把壓縮文件解壓到Eclipse文件夾下,由文檔中的路徑 來處理其它一切。

  現在,你已經準備好創建一個Ruby工程了(見圖1)。


圖1.創建一個新的Ruby工程


  與Java相比,Ruby在命名和目錄結構方面要求並不嚴格。在Ruby中創建一個工程實際上只創建一個目錄和一個工程文件(不需要. classpath文件,因爲Ruby沒有classpath)。另外一個與Java技術的顯著區別是,Ruby工程嚮導並不創建顯式的src和bin目 錄。Ruby是解釋型的,因此沒有輸出文件夾。如果你有一個小工程,那麼你可以把Ruby源文件放在與工程文件相同的文件夾下。作爲選擇,你還可以創建你 自己的目錄層次。你會發現,與Java相比,Ruby很少關心這些。

  接下來,你將創建一個Ruby源文件。沒有特定的嚮導用於創建一個Ruby源文件。與Java技術相比,Ruby源文件中僅需要較少的結構,所以,爲了創建一個Ruby文件,你需要右擊工程來創建一個新文件(見下圖2)。


圖2.創建一個Ruby源文件

別忘記把標準擴展名.rb添加到該文件(它是正常的Ruby擴展名)。創建一個Ruby文件應該會打開如圖3所示的Ruby視圖。


圖3.創建一個Ruby文件將啓動Ruby視圖

Ruby還提供了一個Outline視圖(類似於Java提供的那種)。就象它的Java對應物一樣,它允許你在Ruby源文件的元素之間進行導航。在圖4中,raise_salary_by方法在Outline和源碼視圖中都被加亮。


圖4.這個Outline視圖實現在源文件中的導航

就象其它複雜的插件一樣,RDT也允許通過"Window>Preferences"對話框增加定製特徵。這個定製對話框見圖5。


圖5.RDT安裝"Preferences"以便實現定製

參數選擇"Preferences"菜單項允許你改變語法加亮,格式化(Ruby世界中的標準縮進是兩個空格,而不是四個空格,所以請準備好作一些調整),等等。它還允許你定製編輯器模板並選擇你自己的解釋器。

  六、 RDT編輯器

  在Java世界中,我們已習慣於高級編輯器特徵-這使得在轉到其它不提供同樣支持的其它環境時比較困難。RubyIDE中所缺乏的特徵之一是沒有提供內容助手(它能夠提供上下文相關的標識符查找功能)。幸好,RDT編輯器中含有針對Ruby代碼的內容助手,見下圖6。


圖6.RDT編輯器提供了內容助手

在Ruby中,你不能把一種類型賦值給一個變量或一個方法的返回,而由標識符上下文確定在運行時刻的類型。Ruby中引入了一種被親切地稱爲 "ducktyping"的方法。這種方法的思想是,如果它接受一個假(quack)消息,那麼它必須是一個"duck"。這看起來似乎妨礙了那些已經習 慣了強類型化語言的用戶,這種鬆散類型耦合能夠支持Ruby語言中一些更強有力的特徵。例如,你可以用Ruby編寫一個異常處理器-當你調用一個並不存在 的方法時激活它,然後由該異常處理處理器來自由分析這個方法,然後再調用它。這種元編程級在強類型化語言中是很難實現的。

  針對內容助手的一個挽回特徵是,Ruby在使用標識符時使用特定的命名慣例。例如,在Ruby中,所有的成員變量在第一次使用它們時就存在,並且全部 由一個@符號所標識,作爲其名字的第一個字符。如果你使用內容助手查找成員變量,那麼你可以輸入@,這樣以來你就只能看見成員變量了。


圖7.在Ruby幫助內容助手中的命名慣例

動態類型化仍然妨礙在Ruby中的上下文敏感問題。在圖7中,唯一有效的成員變量是正好出現在方法聲明上面的那些,也就是@name,@salary和 @hire_year。內容助手所提供的另外一些成員來自於另一個類(後面定義)。目前,RDT編輯器還不足夠複雜以過濾所有的正確語法但語義上不正確的 入口。

  七、 運行與調試

  IDE的特色之一是在同一個環境下運行和調試你構建的應用程序。RDT能夠啓用這兩項功能。

  八、 指定一個解釋器

  這一任務的實現位於Ruby上部和"Installed Interpreters"入口的"Windows>Preferences"對話框中。
Ruby是一種解釋性的語言,因此,在RDT能夠運行或調試你的應用程序之前,你必須把一個解釋器與你的環境關聯。這種關聯位於Ruby頂部的"Windows>Preferences"對話框中的"Installed Interpreters"入口處。


圖8.把一個Ruby解釋器與環境相關聯

對於你正在使用的Ruby版本,你要把"Location"文本域指向bin目錄,之後由RDT來選取所有其它所需要的信息。一旦你關聯瞭解釋器,那麼你就爲運行應用程序作好了準備。

  九、 運行Ruby應用程序

  運行一個Ruby應用程序實際上類似於運行一個Java應用程序。你可以使用Run菜單來創建一個Run配置,見下圖9。


圖9.在RDT中建立一個Run配置

當你運行應用程序時,RDT將把控制切換到Ruby解釋器,然後在Eclipse工作區底部的控制檯窗口內運行應用程序,見下圖10。


圖10.在RDT內運行一個Ruby應用程序

這個實例顯示了運行一個控制檯應用程序,但是運行其它類型的應用程序(如GUI程序)的方式與此相同。

  十、 用RDT調試

  一個IDE要求實現的最關鍵的特徵之一是有效地調試你的應用程序的能力。Ruby解釋器包括一個命令行調試器,但是,在如今的圖形工具時代有誰會使用 一個命令行調試器?幸好,Ruby解釋器還通過一特定(可配置)端口來廣播其調試信息,而就象RDT這樣的工具能夠聽取該端口並且提供開發者們期望的調試 支持類型。

  爲了在RDT中調試一個Ruby應用程序,我們要象上面創建的Run配置一樣創建一個Debug配置。然後,你可以通過點擊左邊的溝槽設置一個斷點並 使用調試器來啓動應用程序。就象在Java技術中一樣,IDE將詢問你,是否你想要切換到調試視圖下。如果你願意,則你將看見類似下面圖11所示的內容:


圖11.在RDT中調試Ruby應用程序

RDT中支持與Java技術調試相同的調試級別。左上邊的格子顯示出當前執行的線程,右上面的格子顯示出變量的值。就象在Java編程語言中一樣,你可 以進一步分析對象以觀看它們內在的成員變量值。中間左邊的格子顯示當前正運行的應用程序的源代碼,中間右邊的格子顯示Outline視圖-它在這裏擔當編 輯器的作用,允許你通過點按一個標識符來進行導航。Debug窗口的底部顯示出Ruby解釋器在端口1098上廣播的調試信息,而由RDT在該端口上聽取 調試信息。

  調試器支持是RDT的特色。就算你有一個具有優秀的Ruby支持的編輯器,你仍然必須依靠命令行調試器來調試你的應用程序。擁有一個具有全面功能的調試器將會大大提高軟件的生產效率。

  十一、 測試

  作爲Java開發者最難實現的Ruby特徵之一是動態類型化。如果你習慣於一種強類型化語言,那麼動態類型化看上去似乎有點混亂。DT允許各種高級元 編程技巧-這在一種強類型化語言中是很難或不可能實現的。當然,你可以放棄編譯時刻類型檢查的安全設置。那麼,是否有一個方法能夠實現兩種世界的最佳結合 呢?

  單元測試應該是每一種語言必須實現的,但是它在動態語言中特別關鍵。單元測試比編譯揭示了更多的內容。事實上,你應該改變在單元測試和編譯之間的關係 上的觀點。最近,一位高級軟件開發專家認爲,"在今後的五年內,我們會把編譯作爲單元測試的一種弱的實現形式"。單元測試能夠提供證實 (verification)-編碼將如期實現,而不是僅僅進行你輸入內容的語法檢查。

  考慮到單元測試在Ruby世界中的極端重要性,你一定會希望RDT能夠使得單元測試易於運行。的確如此!單元測試被包括在Ruby內,因此你不必下載 任何其它的擴展。Ruby庫中包括了一個TestCase類和一個TestSuite的概念。你可以象創建任何另外的Ruby類一樣來創建你的單元測試, 從Test::Unit::TestCase中子類化你的測試。列表1是一個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
相應的單元測試如下:

  列表2.相應於Employee類的單元測試
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
爲了運行這個單元測試,你可以爲該單元測試類創建一個Run配置-作爲一個Test::Unit類型,見圖12。


圖12.RDT包括一個Test::Unit Run配置

當你運行這個測試時,你會得到與Java單元測試相同的支持元素,包括在左下角的類JUnit格子。


圖13.運行於IDE中的一個單元測試的例子

你還可以在Ruby中創建TestSuites。TestSuites是Ruby類,它定義一個返回TestSuite的suite方法。這個 TestSuite由自動地在每個TestCases中定義的suite組成。列表3是針對幾個類的一個示例TestSuite。

  列表3.一些類的示例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)
不同於前面運行單個TestCase的實例,這裏的suite作爲一獨立的應用程序運行。Ruby有兩個方法可以顯示TestSuite的結果。第一個 是"Console Test Runner"-它在控制檯輸出它的結果。第二個是"TkTestRunner",它創建一個熟悉的對話框來顯示測試的結果。圖14顯示了一個Tk TestSuite對話框。


圖14.圖形式的TestSuite對話框

十二、 新版本中的改進

  RDT的當前版本是0.50。目前,其開發者正在開發0.60版本。下一個版本中將改進的方面包括:

  · 代碼摺疊功能-提供針對類和方法的代碼摺疊功能。

  · Outline視圖-提供更詳細的信息,包括對局部變量的支持。

  · RI視圖-從一個RDT視圖中使用Ruby的ri工具。

  · 任務標籤-以Ruby註釋形式爲可配置的關鍵字(如TODO,FIXME)創建任務。

  · 編輯器方面的改進-自動添加大括號,圓括號和單/雙引號;還有更好的代碼助手。

  · 檢查器快捷方式-在一個調試會話期間,針對經常使用的檢查器提供可配置的快捷方式,如顯示一個對象的所有方法,全局常量,等等。

  接下來的版本將更好地使用JRuby字節碼編譯器。JRuby是一項工程,它允許把Ruby代碼編譯爲Java字節碼。這意味着,RDT的以後版本將更容易地加入到Eclipse世界中,甚至提供更好的支持。

   十三、 總結

  Ruby最終爲業界人士所廣泛認可和應用。其中,部分原因應該歸功於Ruby on Rails工程的成功的驅動。如今,已經到了考慮如何把Ruby加入到你的"競爭工具箱"中的時候了。當然,RDT也是吸引你加入這一領域的一個重要因素。


原文地址[天極]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章