Web Development 的學習之旅

2007/05/11

摘錄: 脫離 Rails 看 Ruby

原始文章請看: http://www-128.ibm.com/developerworks/tw/library/j-ruby/

底下是自己對該文的一些摘錄, 片片斷斷的. 原文作者是 Java programmer, 對於擁有開闊的心來瞭解不同其他的語言, 發掘優勢, 並加以運用在日常工作上表示敬意, 我想這正是 Programmer 不斷進步的源頭.(註:不是指學習不同的語言, 而是指擁有開闊的心)

不止是 Java 領域, 很早以前我也發現許多的 Delphi 程式設計師, 也相當瞭解 PHP (或其他語言), 他們不一定用 PHP 來開發 Web App, 也有很多是運用 PHP 來協助完成平日的 Delphi 專案. 在 Ruby 漸受重視的今天, 我也開始看到有 Delphi Programmer 運用 Ruby 來發揮在不同的用途, 而不只侷限運用在 Web App .




Ruby on Rails 只是使 Ruby 非常強大的方面之一,就像 EJB 只是 Java™ 企業平臺的一部分一樣。Andrew Glover 揭示了 Java 開發人員可以使用 Ruby 做什麼。

有人可能會說 Ruby 的語法很簡潔,這正是它的意圖:這種語言使開發人員可以迅速撰寫簡潔的程式碼。...如果用 Java 語言和 Ruby 分別定義同一個類別,透過比較,就能夠看到這種簡潔性。

Ruby 並不使用 Java 程式碼中的 new ObjectInstance() 語法,Ruby 實際上支援在物件上呼叫 new 方法,即在內部呼叫 initialize 方法。

在清單 4 中,我用 Ruby 的 require 方法(這個方法可以在 Kernel 類別中找到)“匯入了” dictionary 模組。

在清單 4 中建立 happy_wrd 實例時沒有 指定 Definition 或同義詞集合。我只為 spelling 和 part_of_speech 傳遞了值。可以進行這樣的省略是因為 Ruby 支援參數的預設值。...這基本上就是告訴 Ruby 如果呼叫者沒有提供這些集合,就將它們預設設定為空集合。

Ruby 的集合處理同樣簡單得令人吃驚;看看 Word 類別中的 add_definition 和 add_synonym 方法就知道了。<< 語法被重載,表示 add。如果再看看 清單 2 中的 Definition 類別,就會發現 Java 語言中的對應程式碼複雜多了...清單 6 中的程式碼只觸及到了 Ruby 集合處理的皮毛!

attr_reader 和 attr_writer 都不是關鍵字,而是 Ruby 中的實際方法(在 Module 類別中),它們以符號作為參數。符號 是前面有冒號(:)的任何變數,更妙的是符號本身也是物件

靈活的迭代方式也是用 Ruby 撰寫程式碼時的樂趣之一。...each 方法本質上就像 Java 語言中的 Iterator,但是它更簡潔。在清單 8 中,each 方法處理迭代的細節,使呼叫者能夠將注意力集中在想要的效果上。

Ruby 也 支援大家熟悉的 Java 迴圈結構,比如 for 和 while;但是在實務中很少用到這些結構,因為 Ruby 中的幾乎所有東西都支援迭代表示法

在 Java 語言中,如果條件結構的體只有一行,那麼可以省略括弧。在 Ruby 中,如果條件結構的體只有一行,那麼可以撰寫 清單 11 中所示的運算式。還要注意,同樣的條件還可以寫成 definition.word = self unless definition.word == self,這使用了 Ruby 的 unless 特性。這很棒,不是嗎?

因為 Ruby 是動態類型語言,所以它不需要介面。但是要記住,介面的功能在 Ruby 中是存在的,只是以靈活得多的方式表現出來。Ruby 中的多態性被親切地稱為 “duck typing”

在 Ruby 中沒有介面!只要方法名匹配,就可以利用多態性。...在清單 16 中,用 Ruby 重新建立了 Java Filter 類型。注意,每個類別之間並沒有關係(只不過它們都擁有同一個方法 apply_filter)。是的,這兩個類別應該被重構以擴充 Filter 基類別;但是,在這裡我只是想展示在 Ruby 中如何利用多態性,而類別並不共用相同的類型。

在清單 17 中,我使用 Ruby 的 Test::Unit(這就像 Java 的 JUnit)來示範 duck typing。順便說一句,在 Ruby 中建立自動測試只需擴充 Test::Unit 並加入以 test 開頭的方法。這與 JUnit 很相似,對嗎?...還要注意 Ruby 多麼輕鬆地支援正則運算式。要建立正則運算式,只需使用 / regex / 語法。因此,清單 17 中 RegexFilter 的正則運算式是一個大寫的 G,後面是一個或多個 o,最後是 gle。

Ruby 沒有介面,但是它有 mix-in。可以把 mix-in 看成多重繼承,但是它沒有 多重繼承的麻煩。mix-ins 是模組(不能被實例化),其中包含類別可以選擇包含的方法。這些模組方法會變成包含它們的類別的實例方法。

學習多種自然語言的經驗告訴我們,可以混合使用不同的程式設計語言是件好事兒。能夠用多種語言進行程式設計,使您在面對各種程式設計任務時具有更大的靈活性。這還會提升您的程式設計母語的價值。

正如在本文開頭所說的,我主要是 Java 開發人員,但是我發現有許多辦法可以將 Ruby(和 Groovy、Jython 等等)用在工作中。而且這麼做的時候不需要使用 Rails!如果您放棄了 Ruby on Rails,因為您實際上不需要 在短時間內建立購物車應用程式,那麼好好瞭解一下 Ruby 本身吧。我認為您會喜歡自己看到的東西。

沒有留言: