没有Rails Java程序员如何使用Ruby(1)

发表于:2007-06-11来源:作者:点击数: 标签:
一、引言 Ruby on Rails仅是使Ruby成为伟大的一个因素,这就象EJB仅是 Java 企业平台的一个组成部分一样。本文将带你一同讨论,作为一名Java 开发 者,仅利用Ruby自身所能够实现的功能。 首先让我先澄清一些问题。第一,这不是一篇关于Ruby on Rails的文章。

一、引言

Ruby on Rails仅是使Ruby成为伟大的一个因素,这就象EJB仅是Java企业平台的一个组成部分一样。本文将带你一同讨论,作为一名Java开发者,仅利用Ruby自身所能够实现的功能。

首先让我先澄清一些问题。第一,这不是一篇关于Ruby on Rails的文章。如果你想了解Rails,那么每周都出版新的文章和博客来颂扬这种令人激动的框架及其各种特征。第二,本文并非在预告,在目前出现一些更好的语言、工具和框架(如Ruby on Rails)时,Java平台即将崩溃。因此,本文与最近有关Ruby的主题并无多大关系。

别误会我-在我看来,Rails还是相当绝妙的!它是如此惊人地有力以致明显地影响了Web开发的许多方面。我的唯一看法是,有更多的关于Ruby而不是Rails的东西,特别是当从一个Java开发者的角度来看问题时。Rails的特长是网站开发;然而,我发现自己在构建网站时并没有经常使用这种技术。我所构建的大多数网站主要使用了Struts,Tapestry或其它一些技术。当我利用Ruby时,我仅把它作为开发实践的一部分来使用。因此,在本文中我将讨论,如果你主要是一位Java开发者,那么如何用Ruby来进行开发。

二、初步感觉

Ruby的语法与Java语言存在明显区别。首先,Ruby没有括号或分号,并且它的类型完全是可选的。一些人可能说Ruby的语法相当精炼,并且它的目的之一就是用短命令编写简明的代码。

通过比较实现一个功能相对完善的类你就可以体会到这一点,在本文中我们先用Java语言定义它,然后再用Ruby来实现。本文中我先使用两个类:Word和Definition。在图1的简单类图中,你可以看到两个类共享一些关系:

◆一个Word拥有一个同义词(也称作Word实例)集合。

◆一个Word还可以拥有一个Definition集合。

◆一个Definition有一个到Word的聚合关联(aggregation association)。

没有Rails Java<STRONG><A href=程序员如何使用Ruby" src="http://www.ltesting.net/uploads/2007/06/8_200706111508311.gif" border=0>

图1:一本含有单词及其定义的简单字典的类图

三、在Java语言中的类定义

在列表1中,我用Java语言定义了Word类。请注意,我必须实现我的集合中Definition和同义词的关系确认。这是必要的,因为在这个示例中,Definition的创建不需要用一个Word关系来初始化,而Word也可以在不使用Definition初始化的情况下定义。

列表1.用Java语言实现的一个类Word

package com.vanward.dictionary;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Iterator;

public class Word {

 private String spelling;

 private String partOfSpeech;

 private Collection definitions;

 private Collection synonyms;

 public Word(String spelling, String partOfSpeech) {

this.spelling = spelling;

this.partOfSpeech = partOfSpeech;

this.definitions = new ArrayList();

this.synonyms = new ArrayList();

 }

 public Word(String spelling, String partOfSpeech, Collection definitions) {

this(spelling, partOfSpeech);

if(definitions != null){

 for(Iterator iter = definitions.iterator(); iter.hasNext();){

this.validateRelationship((Definition)iter.next());

 }

 this.definitions = definitions;

}

 }

 public Word(String spelling, String partOfSpeech, Collection definitions, Collection

synonyms) {

this(spelling, partOfSpeech, definitions);

if(synonyms != null){

 this.synonyms = synonyms;

}

 }

 private void validateRelationship(Definition def){

if(def.getWord() == null || def.getWord() != this){

 def.setWord(this);

}

 }

 public Collection getDefinitions() {

return definitions;

 }

 public void addDefinition(Definition definition) {

this.validateRelationship(definition);

this.definitions.add(definition);

 }

 public String getPartOfSpeech() {

return partOfSpeech;

 }

 public void setPartOfSpeech(String partOfSpeech) {

this.partOfSpeech = partOfSpeech;

 }

 public String getSpelling() {

return spelling;

 }

 public void setSpelling(String spelling) {

this.spelling = spelling;

 }

 public Collection getSynonyms() {

return synonyms;

 }

 public void addSynonym(Word synonym) {

this.synonyms.add(synonym);

 }

}

列表1中的Word类相当简单-它是一个JavaBean,它有一个构造器链允许用户用各种属性集来创建Word。还要注意,它的synonyms和definitions属性都被设置为只读的(也就是说,它们没有相应的setter方法)。你只能为一个同义词添加一个Definition或另一个Word实例。

在列表2中,你将看到相关的Definition类,它类似于Word类-它的exampleSentences属性也没有一个相应的set()方法:

列表2.用Java语言实现的一个Definition类

package com.vanward.dictionary;

import java.util.Collection;

public class Definition {

 private Word word;

 private String definition;

 private Collection exampleSentences;

 public Definition(String definition){

this.definition = definition;

this.exampleSentences = new ArrayList();

 }

 public Definition(String definition, Word word) {

this(definition);

this.word = word;

 }

 public Definition(String definition, Word word,Collection exampleSentences) {

this(definition, word);

if(exampleSentences != null){

 this.exampleSentences = exampleSentences;

}

 }

 public String getDefinition() {

return definition;

 }

 public void setDefinition(String definition) {

this.definition = definition;

 }

 public Collection getExampleSentences() {

return exampleSentences;

 }

 public void addExampleSentence(String exampleSentence) {

this.exampleSentences.add(exampleSentence);

 }

 public Word getWord() {

return word;

 }

 public void setWord(Word word) {

this.word = word;

 }

}

四、在Ruby中定义类

在列表3中,你可以看见以Ruby定义的两个相同的类;然而,列表3看上去与上面相当不同,对不对?

列表3.用Ruby定义的两个与前面功能相同的类

module Dictionary

class Word

 attr_reader :spelling, :part_of_speech, :definitions, :synonyms

 attr_writer :spelling, :part_of_speech

 def initialize(spelling, part_of_speech, definitions = [], synonyms = [])

 @spelling = spelling

 @part_of_speech = part_of_speech

 definitions.each{ |idef| idef.word = self}

 @definitions = definitions

 @synonyms = synonyms

end

def add_definition(definition)

 definition.word = self if definition.word != self

 @definitions << definition

end

def add_synonym(synonym)

 @synonyms << synonym

end

end

class Definition

 attr_reader :definition, :word, :example_sentences

 attr_writer :definition, :word

 def initialize(definition, word = nil, example_sentences = [])

 @definition = definition

 @word = word

 @example_sentences = example_sentences

end

end

end


共5页: 1 [2] [3] [4] [5] 下一页

原文转自:http://www.ltesting.net

...