論壇文章
高速開發的網路應用系統架構-Ruby on Rails (RoR)

對有使用過Ruby on Rails(簡稱RoR)的開發者而言,多數人的感想就是「快」,根據「超越Java(Beyond Java)」一書所述,使用RoR的開發速度可快上5至10倍;除了速度上的優勢外,Rails更在2006年獲得有『軟體界的奧斯卡獎』之稱的Jolt Awards,證明其在網站開發工具的實力已不容忽視,另外由於「Agile Web Development with Rails」一書也獲得了技術類書籍的Jolt Awards,使得RoR成為火紅的應用程式開發語言之一。本文將針對RoR做一概要的介紹。

RoR的源起

在介紹RoR前,必須先介紹Ruby的起源,Ruby是一個純物件導向語言,擁有簡潔的語法、內建正規表達式引擎、異常處理機制等特性。1993年由日本人松本行弘(Matsumoto Yukihiro)開發,當時松本的同事有感於「Perl寫來方便但讀起來很難。如果有好的物件導向Scripting語言就好了。」因此,松本在原有的Perl上加入物件導向概念,並於1995年正式釋出。雖然最初有關Ruby的相關文件與網路討論均以日文為主,且早期的採用者也都集中在日本,但松本一開始就有「不要只有侷限在日本」的願景,遂於1997年開始建立英文Mailing list,就連變更記錄也附有英文,才逐漸提升Ruby在國際上的能見度。

Ruby會如此火紅,除了開發者本身的努力外,RoR架構的出現更是一大功臣。RoR是David Heinemeier Hansson(簡稱DHH)在2004年為了Basecamp專案而開發的網站架構,於2005年12月釋出1.0.0版,RoR具有開發速度快、部署與維護容易等特色,一出來就廣受開發人員的歡迎,DHH也因此獲得了Google與O'Reilly共同頒發的『年度最佳駭客獎』。

RoR的特色

為了讓程式開發更快速,RoR提供許多方便的功能,如:

  • 約定優於配置(Convention Over Configuration):隨著網路應用程式架構的演進,模組化的概念也逐漸盛行,為了讓各模組能相互溝通,配置檔的設定就成為不得不處理的部份,但過多的設定檔反而為開發者帶來困擾,為解決上述問題,RoR採用更有效率的作法,將類別、方法、資料表等都採取預設的命名約定,開發者只需依循約定即可,甚至可以不用在配置檔中多寫任何一行設定。DRY(DonRepeat Yourself):RoR提供Helper、Partial等方式來減少相似程式碼的重覆,進而使程式碼簡潔並降低出錯的機率。
  • 功能完整的框架:大部份的框架都是藉由外掛的方式增加功能,RoR則提供一般網路應用系統均會用到的模組,以應付大多數的開發情況,如:Ajax、Web Service、ORM(Object Relational Mapping)等。
  • 資料庫Schema版本管理:RoR裡的Migration能提供與資料庫平台無關的資料庫Schema與前者的版本控管,讓開發者能放心的修改Schema而不須擔心遺失舊有的Schema。

RoR的架構

RoR的架構基本上符合MVC(Model View Controller)架構,包含以下各模組:

  • Active Record:負責ORM(Object Relational Mapping)
  • Active Pack:負責MVC架構中View和Controller的部份,包括以下兩部份:
    - Action Controller:處理從Clinet端傳入的Request,並將其重新導向,此外也負責與Active Record、Action Mail、Action Web Service等模組的溝通。
    - Action View:使用內建的範本引擎來產生給Clinet的回應
  • Prototype:提供Ajax與相關視覺效果,例如:畫面上項目的拖拉
  • Action Mail:提供收發信件的功能
  • Action Web Service:協助開發者能輕易地在應用程式中加入Web Service API,支援SOAP、XML-RPC、及WSDL。

RoR的運作流程

以網路商店中新增商品進使用者的購物車為例。在RoR中,簡便的作法是以傳遞URL的方式來執行,伺服器上的Dispatcher Servlet負責解析網址並將Request導向給正確的Action Controller,解析方式請見圖三,Store Controller的add_to_cart方法根據傳入的參數利用Active Record與資料庫進行CRUD(Create、Retrieve、Update and Delete)等動作,以上動作結束後,Store Controller再呼叫Action View產生執行結果的畫面回應給使用者。

頗受爭議的部份

雖然RoR在開發上擁有速度上的優勢,但它仍有頗受爭議的部份:

  • 延展性(Scalability):雖然網路已有如何增加RoR延展性的文章,但有關延展性的質疑聲卻從未間斷過,在大型系統實作出現之前,相關的論戰似乎難有定論。
  • 對舊有DB Schema的支援:如果在Schema中有使用某些用法,例如複合鍵,那麼開發者就必須考慮修改Schema或在RoR中多增加些手續才可順利建置。
  • 執行期速度:Ruby具有晚期連結(late binding)以及鴨子型別處理(duck typing)的特性,在程式執行時需較多檢核步驟。

結論

對多數的開發者而言,RoR算是嶄新的領域,其所帶來的高生產力已讓人眼睛為之一亮,雖然目前仍有頗受爭議之處,但隨著投入者的增加,RoR的成熟是可期待的。