企业网上书店网站建设设计,网站怎么做图片搜索,网站内容页相关性怎么做,滨江区建设局网站在开始这篇文章之前#xff0c;我需要澄清一些事情。首先#xff0c;这不是一篇关于 Ruby on Rails 的文章。如果您希望了解 Rails#xff0c;每周#xff08;甚至每小时#xff09;都有相关的文章和 blog 出现#xff0c;它们都对这个令人兴奋的框架的众多特性大加推崇我需要澄清一些事情。首先这不是一篇关于 Ruby on Rails 的文章。如果您希望了解 Rails每周甚至每小时都有相关的文章和 blog 出现它们都对这个令人兴奋的框架的众多特性大加推崇请参见 参考资料 中的列表。其次本文并不是想预言Java 面对像 Ruby on Rails 这样更好的 语言、工具和框架会衰败下去。所以本文并不涉及近来通常与 Ruby 最相关的主题。 别误会 —— 我认为 Rails 是令人难以置信的它的功能极其强大已经明显地改变了 Web 开发的面貌和步调。我只想指出一点Ruby 要比 Rails 功能丰富尤其是从 Java 开发人员的视角来看。 Rails 的专长是 Web 站点开发但是我自己没有构建过全新的 Web 站点。我所工作的大多数 Web 站点已经 使用 Struts、Tapestry 或其他技术构建起来了。在我利用 Ruby 时基本上是将它作为一种与 Java 平台衔接的开发实践。所以在本文中我将谈谈如果您主要是 Java 开发人员那么应该如何利用 Ruby 进行开发。 掌握多种语言的好处如果您掌握了多种语言在与多个国家的朋友一起旅行时能够帮助他们消除语言障碍从而获得尊重会外语也会提升您在本国语言环境中的地位。掌握多种编程语言 也有同样的好处。与只会一种语言的人相比掌握多种编程语言的开发人员在 IT 世界中会更自由他们能够将技能应用于任何环境而且他们在自己的编程母语 领域中也会更受尊重因为他们了解源自这种母语的其他东西。您不想掌握多种语言吗 感觉是如此不同 Ruby 的语法与 Java 语言的语法不同。首先Ruby 没有方括号或分号而且它使类型成为完全可选的。有人可能会说 Ruby 的语法很简洁这正是它的意图这种语言使开发人员可以迅速编写简洁的代码。 如果用 Java 语言和 Ruby 分别定义同一个类通过比较就能够看到这种简洁性。我先给出用 Java 语言编写的两个类 —— Word 和 Definition就像是词典。在图 1 所示的简单类图中可以看出这两个类有几个关系如果这种复杂性看起来不自然请忍耐一下这是有意义的 一个 Word 可以拥有一个同义词Word 的实例集合。 一个 Word 还拥有一个 Definition 集合。 一个 Definition 拥有一个对 Word 的聚合关联。 图 1. 具有单词和定义的简单词典用 Java 语言编写的类定义 在清单 1 中用 Java 语言定义了 Word 类。注意必须对 Definition 和同义词集合进行关系检验。这是因为在这个例子中最初创建 Definition 时可以不带 Word 关系最初定义 Word 时也可以不带 Definition。 清单 1. 用 Java 语言编写的 Word 类 清单 1 中的 Word 类相当简单它是一个 JavaBean具有一个构造函数链使用户能够用各种属性集创建 Word。还要注意它的 synonyms 和 definitions 属性是 只读的即没有针对它们的设置方法。只能添加 一个 Definition 实例或者为一个同义词添加 另一个 Word。 在清单 2 中是相关的 Definition 类这个类与 Word 类的相似之处是它的 exampleSentences 属性没有对应的 set() 方法 清单 2. 用 Java 语言编写的 Definition 类 用 Ruby 编写的类定义 在清单 3 中可以看到用 Ruby 定义的这两个类。清单 3 确实 看起来很不一样不是吗 清单 3. 用 Ruby 编写的相同类 从清单 3 中可以看出Ruby 的语法非常简洁。但是不要让这种简洁性欺骗了您这段代码中有许多内容首先在一个模块 中定义了两个类模块本质上相当于 Java 语言中的 包。另外能够在一个文件中定义这些类而 Java 语言要求用两个文件。您还会注意到Ruby 的构造函数名为 initialize而 Java 语言中的构造函数使用类名进行命名。 回页首创建对象实例 在 Ruby 中创建新的对象实例的方式是不一样的。Ruby 并不使用 Java 代码中的 new ObjectInstance() 语法Ruby 实际上支持在对象上调用 new 方法即在内部调用 initialize 方法。在清单 4 中可以看到如何在 Ruby 中创建一个 Word 实例和一些对应的 Definition 清单 4. 在 Ruby 中创建新的对象实例 在清单 4 中我用 Ruby 的 require 方法这个方法可以在 Kernel 类中找到“导入了” dictionary 模块。然后通过 Object.new 语法创建一个新的 Word 实例ebullient。尽管导入了 dictionary 模块但是仍然需要对对象实例进行限定因此采用 Dictionary::Word。如果在 require 子句后面编写了 include Dictionary那么也可以去掉 Dictionary:: 前缀。 默认参数值 您是否注意到了在清单 4 中创建 happy_wrd 实例时没有 指定 Definition 或同义词集合。我只为 spelling 和 part_of_speech 传递了值。可以进行这样的省略是因为 Ruby 支持参数的默认值。在清单 3 定义的 Word 的 initialize 方法中指定了 definitions [] 和 synonyms [] 作为参数这基本上就是告诉 Ruby 如果调用者没有提供这些集合就将它们默认设置为空集合。 还要注意在 清单 3 中 Definition 的 initialize 方法如何通过将 example_sentences 设置为一个空集合从而支持默认参数word 的默认值 nil 是 Java 语言中 null 的 Ruby 版本。回到 清单 1在这里必须创建三个构造函数 才能获得 Java 语言提供的相同灵活性 现在我用灵活的 initialize() 方法创建另一个 Word 实例见清单 5 清单 5. 灵活性的表现 在定义两个 Definition 之后将它们添加进一个集合中集合看起来就像 Java 语言中的数组。然后将这个集合传递给 Word 的 initialize() 方法。 回页首集合的处理 Ruby 的集合处理同样简单得令人吃惊看看 Word 类中的 add_definition 和 add_synonym 方法就知道了。 语法被重载表示 add。如果再看看 清单 2 中的 Definition 类就会发现 Java 语言中的对应代码复杂多了this.exampleSentences.add(exampleSentence)。 干净利落的方括号对于集合您不认为 Ruby 的 [] 语法非常干净利落吗如果您是 Groovy 用户就应该很熟悉这种语法。 Ruby 的集合处理非常简洁。在清单 6 中可以看到组合集合使用 操作符和访问成员通过 [ position ]是多么容易没有 什么值得操心的东西 清单 6. 简练的集合 清单 6 中的代码只触及到了 Ruby 集合处理的皮毛 回页首RubyBean? 在 清单 3 中的两个类中您可能会注意到Ruby 支持一种定义属性的简写方式attr_reader 和 attr_writer。因为使用了这种方式所以可以在 Word 类中设置 和获取 对应的属性如清单 7 所示 清单 7. attr_reader 和 attr_writer 的作用 attr_reader 和 attr_writer 都不是关键词而是 Ruby 中的实际方法在 Module 类中它们以符号作为参数。符号 是前面有冒号:的任何变量更妙的是符号本身也是对象 注意因为在 清单 3 中使 synonyms 成为只读的所以 Ruby 拒绝执行清单 7 中的最后一行代码。另外还可以使用 attr_accessor 方法编写属性声明代码指出属性是既可读又 可写的。 回页首观察 Ruby 的迭代 灵活的迭代方式也是用 Ruby 编写代码时的乐趣之一。看一下清单 8这里给出了 Word 的 initialize() 方法 清单 8. 闭包是很方便的 清单 8 的第四行有点儿与众不同。为了让初学者看明白在 definitions 实例上调用 each 方法时使用了花括号。each 方法本质上就像 Java 语言中的 Iterator但是它更简洁。在清单 8 中each 方法处理迭代的细节使调用者能够将注意力集中在想要的效果上。在这个例子中传递一个代码块来表示以下意思对于集合中的每个值 —— 即 idef这是 Definition 的一个实例将它的 word 属性设置为 self这相当于 Java 语言中的 this。 清单 9 给出 Java 语言中等效的代码行取自 清单 1 中的 Word 构造函数 清单 9. Ruby 的 each 方法就像 Java 的 Iterator 是的是的是的... Java 5 的泛型和新的 for 循环语法比清单 9 中的代码好得多。Ruby 也 支持大家熟悉的 Java 循环结构比如 for 和 while但是在实践中很少用到这些结构因为 Ruby 中的几乎所有东西都支持迭代表示法。例如在清单 10 中可以看出迭代文件的内容是多么容易 清单 10. 迭代非常简单 Ruby 中支持 each 方法的任何类比如 File都允许以这种方式进行迭代。顺便说一句Ruby 的 puts 方法见清单 10相当于 Java 语言的 System.out.println。 回页首条件语法 讨论了循环之后我们来看看 清单 3 的 Word 类中的条件语句。在清单 11 中单独给出了 add_definition() 方法 清单 11. 漂亮的条件语法 仔细看看第二行代码。看得出 if 语句的逻辑吗可以 将它改写为清单 12 所示的一般形式但是清单 11 不是更好吗 清单 12. 表达条件有多种方式 在 Java 语言中如果条件结构的体只有一行那么可以省略括号。在 Ruby 中如果条件结构的体只有一行那么可以编写 清单 11 中所示的表达式。还要注意同样的条件还可以写成 definition.word self unless definition.word self这使用了 Ruby 的 unless 特性。这很棒不是吗 回页首Ruby 中的多态性 因为 Ruby 是动态类型语言所以它不需要接口。但是要记住接口的功能在 Ruby 中是存在的只是以灵活得多的方式表现出来。Ruby 中的多态性被亲切地称为 “duck typing”意思是如果它走起路来像鸭子叫起来也像鸭子那么它一定是鸭子这种多态性只是对方法名进行匹配的问题。我们来比较一下 Ruby 和 Java 语言中的多态性。 Java 的多态性 在 Java 语言中利用多态性的方式之一是声明一个接口类型并让其他类型实现这个接口。然后就可以按照接口类型引用实现此接口的对象并调用这个接口中存在的任何方法。例如在清单 13 中定义了一个简单的接口 Filter 清单 13. 简单的 Java 接口 在清单 14 中定义了一个名为 RegexPackageFilter 的实现类它应用一个正则表达式来进行过滤 清单 14. RegexPackageFilter 实现了 Filter 现在假设有 Filter 接口的多个实现比如 RegexPackageFilter、ClassInclusionFilter 类型和 SimplePackageFilter 类型。为了使应用程序的灵活性最大化其他对象现在可以引用接口类型Filter而不是实现者如清单 15 所示 清单 15. 多态性非常酷 Ruby 多态性 在 Ruby 中没有接口只要方法名匹配就可以利用多态性。看看吧。 在清单 16 中用 Ruby 重新创建了 Java Filter 类型。注意每个类之间并没有关系只不过它们都拥有同一个方法 apply_filter。是的这两个类应该被重构以扩展 Filter 基类但是在这里我只是想展示在 Ruby 中如何利用多态性而类并不共享相同的类型。 清单 16. 过滤我Ruby 注意在清单 16 中可以通过 ~ 语法在 RegexFilter 的 apply_filter() 方法中创建一个正则表达式匹配器。如果您是 Groovy 用户就应该熟悉它清单 16 说明 Groovy 受到了 Ruby 的强烈影响) duck typing 的表现 在清单 17 中我使用 Ruby 的 Test::Unit这就像 Java 的 JUnit来演示 duck typing。顺便说一句在 Ruby 中建立自动测试只需扩展 Test::Unit 并添加以 test 开头的方法。这与 JUnit 很相似对吗 清单 17. 多态性过滤 注意在 test_filters() 方法中创建了一个包含两个类 SimpleFilter 和 RegexFilter 的集合。这些类并不共享同一个基类但是在对集合进行迭代时仍然可以简单地调用 apply_filter() 方法。 还要注意 Ruby 多么轻松地支持正则表达式。要创建正则表达式只需使用 / regex / 语法。因此清单 17 中 RegexFilter 的正则表达式是一个大写的 G后面是一个或多个 o最后是 gle。 回页首mix-in Ruby 没有接口但是它有 mix-in。可以把 mix-in 看成多重继承但是它没有 多重继承的麻烦。mix-ins 是模块不能被实例化其中包含类可以选择包含的方法。这些模块方法会变成包含它们的类的实例方法。 例如在 JUnit 中Assertion 类是一个具体的类其中包含许多 static 断言方法我们熟悉的 TestCase 类会扩展这些方法。因此任何 TestCase 实现类都可以在它自己的已定义方法中引用断言方法。 Ruby 的单元测试框架有点儿不一样。它并未定义 Assertion 类而是定义了一个 Assertions 模块。这个模块定义了许多断言方法但是 Ruby 不对这个模块进行扩展Ruby 的 TestCase 类以 mix-in 的形式包含 assertion。因此这些断言方法现在都是 TestCase 上的实例方法如 清单 17 所示。 回页首结束语 您已经看到Ruby 的语法与 Java 语言很不一样但是非常容易掌握。另外某些事情用 Ruby 做起来比用 Java 语言容易得多。 学习多种自然语言的经验告诉我们可以混合使用不同的编程语言是件好事儿。能够用多种语言进行编程使您在面对各种编程任务时具有更大的灵活性。这还会提升您的编程母语的价值。 正如在本文开头所说的我主要是 Java 开发人员但是我发现有许多办法可以将 Ruby和 Groovy、Jython 等等用在工作中。而且这么做的时候不需要使用 Rails如果您放弃了 Ruby on Rails因为您实际上不需要 在短时间内构建购物车应用程序那么好好了解一下 Ruby 本身吧。我认为您会喜欢自己看到的东西。 回页首参考资料 学习您可以参阅本文在 developerWorks 全球站点上的 英文原文。“Programming in the Ruby language” Joshua DrakedeveloperWorks2001 年 7 月分为四部分的 Ruby 编程简介。“Test-first Ruby programming” Pat EylerdeveloperWorks2005 年 5 月这个教程介绍用 Ruby 的 Test::Unit 库进行单元测试。“使用 Eclipse 插件 Ruby Development Tools” Neal ForddeveloperWorks2005 年 10 月一种在 Java 平台和 Ruby 之间进行衔接的方式。“使用 Ruby on Rails 快速开发 Web 应用程序” David MertzdeveloperWorks2005 年 6 月深入介绍这种小型平台。“alt.lang.jre: Take a shine to JRuby” Michael Squillace 和 Barry FeigenbaumdeveloperWorks2004 年 9 月要同时获得 Smalltalk 的面向对象能力、Perl 的表达能力和 Java 类库的灵活性吗那就试试 JRuby 吧Programming Ruby: The Pragmatic Programmers Guide David Thomas 和 Andrew HuntAddison-Wesley2001 年这本著名书籍的在线版本。Ten things every Java programmer should know about Ruby Jim WeirichOReilly Open Source Convention2005 年从 Java 开发人员的视角了解 Ruby。实战 Groovy系列 Andrew GloverdeveloperWorks学习 Groovy 的各个方面 —— 这是一种在 Ruby 的启发下为 Java 平台开发的语言。Java 技术专区数百篇关于 Java 编程所有方面的文章。获得产品和技术Ruby 主页下载 Ruby。讨论developerWorks blogs加入 developerWorks 社区回页首关于作者 Andrew Glover 是 Vanward Technologies 的 CTO这是一家 JNetDirect 公司。Vanward 通过有效的开发人员测试策略和框架、软件测量分析和综合以及持续集成帮助软件开发团队和管理者持续监视代码质量从而帮助公司及早 解决软件质量问题。他是 Java Testing PatternsWiley2004 年 9 月一书的合著者。 转载于:https://www.cnblogs.com/jplee/archive/2006/12/04/581925.html