沒有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.anti-gravitydesign.com/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.anti-gravitydesign.com

...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97