使用Eclipse和RDT插件进行Ruby开发(二)

六、 RDT编辑器

在Java世界中,我们已习惯于高级编辑器特征-这使得在转到其它不提供同样支持的其它环境时比较困难。Ruby IDE中所缺乏的特征之一是没有提供内容助手(它能够提供上下文相关的标识符查找功能)。幸好,RDT编辑器中含有针对Ruby代码的内容助手,见下图6。


图6.RDT编辑器提供了内容助手

在Ruby中,你不能把一种类型赋值给一个变量或一个方法的返回,而由标识符上下文确定在运行时刻的类型。Ruby中引入了一种被亲切地称为"duck typing"的方法。这种方法的思想是,如果它接受一个假(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支持的编辑器,你仍然必须依靠命令行调试器来调试你的应用程序。拥有一个具有全面功能的调试器将会大大提高软件的生产效率。

#p#十一、 测试

作为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"-它在控制台输出它的结果。第二个是"Tk TestRunner",它创建一个熟悉的对话框来显示测试的结果。图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也是吸引你加入这一领域的一个重要因素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值