===转至 http://kiwi.csie.chu.edu.tw/blog/archives/133
本篇文章從PHP及Web程式設計師的角度,逐漸帶出Ruby on Rails這個Web Application Framework及其優點,架構觀念。接下來要簡介Ruby及Rails的學習重點。
記得在上次的的主題,重新探討Cakephp, Ruby on Rails與MVC ,我大力地闡述能否實做商業邏輯,或是掌握Model的功用是多麼的重要。而老話一句,這個問題比較會出現在中大型的Web應用程式中,如果說你正在寫的是小小的網頁作業,或許本文對你只有參考的價值。
我會這樣說,是因為我們已經邁向2008年,Web應用程式在Google大神的帶領之下 ,逐漸開始在放出光芒。
在2005年以前,對於很多使用者而言,瀏覽器只不過是個看網頁的東西。而網頁對大多數設計者而言,製作網頁就像在畫一幅畫。動態網頁設計被分做四大領域,平面設計 ,結構設計 ,行為設計 ,伺服端程式設計 , 而這些設計可能會各別使用典型的Photoshop(or Flash),HTML/CSS Editor,Javascript Editor,PHP來完成。然而我舉PHP的例子,大家也應該可以想像的到,它是這五六年間最熱門的伺服端程式語言,如phpbb, phpmyadmin,xoops等高水準,開放原碼的應用程式大家早就耳熟能詳。相較於當時任何可以做出成品的伺服端語言,其直譯式語言的優點,快速編 輯,方便佈局(deploy) ...說到要寫動態網頁,PHP真是首選!
而這些東西在2006年之後就起了大變化,主要還是因為使用者比以往需要更多從瀏覽器得到的資訊,不僅只是看個靜態的網頁,更是將資料傳送出去。當 人們開始這樣用Web表單不斷地把資料往Internet送,並期待畫面下一瞬間就有符合需求的東西的時候,已經不是在「看網頁」,而是在使用Web應用程式 。是的,Web應用程式這個名詞其實還並未真正的深植人心,因為非資訊領域的使用者他們對於Web的認知還是僅僅在於靜態網頁,而資訊領域相關的已經對Web有種使用視窗程式的印象。實際上不管是Google也好,博客來也好,大家都是在用Web應用程式。
從設計者的角度來看,大概在PHP成為主流的時候,重心已經從平面設計逐漸轉移到伺服端程式設計。舉個例來說,你會發現外包網頁製作工作室來製作官 方網頁的業者,在快要完工時,針對內容資料性及操作性正確與否的要求,遠比Flash動畫順暢度及效果還要來得優先(以往是剛好反過來,美工優先)。就像 你使用Word,先不管他的介面是否如Word 2007般炫麗,可是在程式上看到的的排版,跟列印出來紙張上的排版一定不能不一樣。由於PHP連結資料庫的功能相當穩定,解決了資料及操作性的問題後, 設計師們慢慢地就將焦點拉回到Web應用程式的反應速度上。包括平面設計師在內,許多人無一不想讓Web程式像是視窗程式一樣反應快速,也因此將大家遺忘 許久的Javascript找了回來。
從2000年到現在,設計的重心大概是依照HTML -> PHP -> JS來演進,語言的特性也從Tag Language -> Script -> Pure OO Script演進。這樣子的演進,不僅說明了伺服端程式碼的彈性相當重要,因為你可以看見大家不再需要靜態的HTML而是可以產生動態HTML的PHP, 而更明顯的是,大家開始需要瀏覽器的彈性。
在這時代演進中,PHP程式設計師遇到許多問題像是:
我們在面對的已經是上百個使用案例這樣的複雜Web應用程式,競爭對手如Adobe已經推出了AIR(前Apollo),微軟也推出了 ASP.Net Ajax與Silverlight。這些強勢的對手們,目標當然是更強的Web Framework。PHP的任何framework甚至函式庫,是否能有效地"Rapid Development"都是一個問題,更何況是要挑戰這些對手。
Ruby on Rails這個Web Application Framework早在2004年7月的時候,就由David Heinemeier Hansson 率領著37signals 打造了一個專案管理系統叫做Basecamp 。 先不管Basecamp好不好用,而它帶來的影響力就是大家都會問說「這究竟是怎樣寫的?」,也跟著Web2.0的風潮風光了一陣子,之後Rails才逐 漸浮上抬面。一個軟體要有人用,在於設計符合使用者需求,而又讓他們感到習慣的介面。但如果今天所謂的使用者也就是寫程式的人,那他們的希望就是,要能夠 有效率地做出或者維護一個系統及其使用案例,有方便的API可以降低反覆打同一行程式碼的動作。
Rails的第一個最大的優點就是,他可以以同一個語言加上簡短的函式呼叫囊括結構(HTML),行為(Javascript),及伺服器程式語言(Ruby)設計 。
我自己都認為光這一點對很多人來說就是救星了。
至於第二大優點,那就多了~
對於一個有經驗的Web程式設計師而言 Rails具有下列優點:
對於一個Web程式設計新手 ,Rails帶給你的是:
我相信Rails團隊是本持著對設計師們體諒的心,加上未來的夢想在設計整個framework,而不是在展現編程的實力堅強,這也是以往各種函式 庫做不出來的,相當值得所有設計師們學習。在撰寫這篇文章的時候,我也想過是否該提提Python及Django,因為他們也做的很好。
要使用Rails,非得學習Ruby不可。Ruby是一個純物件導向 的語言,意思是說在裡面任何東西,一個字串,一個數字都是一個物件。相較於其他script語言,ruby提供較多的與該物件相關且符合英文意義的成員函式,我們用ruby附的指令介面irb(interactive ruby)展示一下:
可以看到1.succ會回傳1的successor(下一個數字)也就是2,而2的類別當然是Fixnum,也就是可以繼續呼叫succ,也因此有 1.succ.succ這種呼叫法。類似的作法在所有支援物件導向的語言都可見。而ruby不同的地方是他允許不加上"( )"便可以進行呼叫,只不過是沒有傳參數進去,也就是像VB一樣。設計師可以盡量用一行就可以描述一串程式動作,加上所有類別都提供相當實用的成員函式, 便產生非常簡潔的程式碼。
剛剛有提到,ruby是一個純OO的語言,在程式裡任何東西皆為物件,自然就有物件該有的特性。
如果你想要試試語法,可以使用irb,ruby附的編輯器scite,或者是http://tryruby.hobix.com/ 。初學者最常見到就是不知道該呼叫啥成員函式,你可以透過http://www.gotapi.com/rubyrails 去查,或者是任何物件都有一個methods函式可以呼叫,至少你可以掌握你有什麼。
而目前針對ruby語言個人認為比較值得看的參考,就是下列網址:
如果你是熟悉Perl的老手,那Ruby對你而言是再快樂不過的事情了。.Net或是Java的也沒關係,花些時間深度地思考什麼叫做純物件導向,或者去看看Smalltalk,便能從語言面就瞭解Ruby。
因為Rails終究是一個MVC Framework,深讀MVC的內容是相當重要的,一個不小心你的程式碼就會有許多誤用,造成未來維護困難或效能緩慢。說起來就算是老手,一旦遇上趕專案的狀況,為了要快點寫完,很多時候也難逃誤用的命運。
但是在這裡我不詳述Rails的MVC究竟該怎樣去理解或開發,那是下一篇文章,先推薦Agile Web Development with Rails 及Ruby on Rails:Up and running 這兩本書好了。第一本書深入淺出,從觀念,目錄結構到撰寫流程解釋地相當詳盡,對於不是寫Rails的人來說,從中學習MVC也是相當棒的,可惜還沒有中文翻譯。第二本書以實做的角度直接切入程式碼,並且有中文翻譯,對於新手可以說是相當適合。
有關Rails的連結,最推薦的是:
不過既然是介紹,免不了還是要說明一下目錄結構。
Rails的目錄結構如上圖,基本上大部分的程式碼都在apps/,也就是代表你的應用程式本身,在此我們僅介紹撰寫過程中一定會碰到的目錄。
所有的Controller類別基本上都繼承自application.rb,程式碼就擺在controllers/,讓你可以在其中寫所有 Controller共用的成員函式。Helper就是載入到view裡讓view可以呼叫的成員函式,所以application_helper.rb 也是同樣的情況。models/相當單純不用多解釋,而views/除了必須新增和controller同名小寫的目錄來擺rhtml以外,也可以使用所 謂的Layout功能。Layout就是讓所有的view可以選擇性地套入一個主樣版,通常我們在畫面設計上都會做成網站的外框。
在Rails專案產生完畢後,最先就是要編輯database.yml來設定好資料庫系統的存取方式。值得注意的是Rails預設提供三種應用程式 運作使用的環境設定,有development,test,production,分別代表開發時,進行單元測試時,及正式上線時。這三個設定檔理論上應 該分別設定在不同的資料庫,而啟動到底是使用了哪一個設定檔,就是看傳遞給web server怎樣的參數。此外如果有要預先require的函式庫或是include的module,都可以放在environment.rb裡。 route.rb負責上述URL的結構,也就是說那個結構是可以改的。
一個Web應用程式一定有靜態資料,包括圖片,css與js,分別擺在public/的images/,stylesheets /,javascripts/,並且在view裡可以透過image_tag, include_javascript_tag, stylesheet_link_tag來呼叫。Rails提供了DB Migration功能,讓你可以輕鬆地撰寫資料庫schema,並且可以視database.yml轉移到不同的資料庫,利用產生器的話,會自動產生在 db/。
未來Rails的發展方向,不僅會在REST這個主題,使用JRuby來整合Java,甚至是Offline應用程式都有相當大的可能性。以往我發 現,任何視窗上的應用程式,免不了就是一定要遇到作業系統本身帶來的問題,如同Windows,可能他一更新,就封鎖掉你的應用程式。Web是一個開放的 平台,提供很多的創意空間,也不見得要用同一種技術解決問題,有多種瀏覽器可以選擇,不會被侷限在一個平台上。
文章到最後,當然還是得跟各位提一下Rails的缺點,畢竟是以純物件導向撰寫的Web應用程式,所需要的代價就是大量的CPU記憶體資源。也因為 這一點,有很多Rails的開發者也積極地加入叢集化的支援。但畢竟電腦硬體只會越快不會越慢,Web未來的趨勢還是會以敏捷編程(Agile Programming)的方式來快速開發及佔有市場。
written by Kiwi \\ tags: mvc , rails , ruby