A Year on Rails

目前接觸 Ruby on Rails 大約一年的時間,想要用這篇分享一下在這一年中我學到最重要的幾件事。

  1. Rails 是個 web application framework,所以一定要先對 web application 有基本認識,我指的就是 http request-response cycle RESTful
  2. Rails 的 MVC (model-view-controller) 架構,ActiveRecord 代表 model 與 database 互動,ActionPack 中的 ActionDispatch、ActionController 和 ActionView,分別負責了 routing、controller 和 view。
  3. Ruby 是個物件導向的程式語言,要發揮 Ruby 的威力就要熟悉Object-Oriented Programming

如果掌握了上面的幾個重點,當要實做一個功能的時候,思考問題就循著這個脈絡去設計 Rails。


第一階段:

  • 如何在 routes.rb 中安排 resources?
  • 需要發那些 requests 去哪些 resources?
  • request 帶有哪些參數?
這裡提到的 request 與 RESTful,可以想得更遠一點。不只是對自己的 app 發送 http request,還有很常見 Ajax 的 XMLHttpRequest,用JSONP 進行 Cross-Domain Ajax 或是對象是第三方服務 API。

第二階段:

  • controller 的 action 要怎麼處理 request 的參數? 輸出什麼樣的 response?
  • action 中需要透過 model 提供哪些資料? model 中有什麼邏輯?
  • response 的 view 長得是什麼樣子? 前端如何處理 response 的?
有人認為現在開發越來越複雜,MVC pattern 已經不敷使用。但是我對來說MVC pattern 就像是足球陣形442。足球戰術越來越多元讓傳統的442已經落伍,但是442仍然是一個讓人很容易了解、上手的思維,目前主流的4231或是433,也都是根據442演化而來。MVC pattern 當然也可以延伸出很多變化型,很多人喜歡抽出 service object,更有 DCI 對個別情境做服務,這些變化都是為了不要讓複雜的程式碼塞爆 MVC,讓 MVC 更符合單一職責的原則 ( Single Responsibility Principle)。

第三階段:

  • 留意命名原則,看似簡單,其實沒那麼容易。
  • 留意物件導向的多型、封裝、繼承在實作中是如何被使用?
  • 留意是物件之間互動的 “訊息” 大於關注物件本身。
物件導向程式設計 (Object-oriented programming) 是種設計,既然是種設計,就要思考這個設計方式能夠為目前架構帶來什麼樣的好處。好的設計就是能夠讓未來的變化可以彈性地做出調整。而 Rails 本身就有些地方是不符合 OOP 的,所以也不要完全就被OOP 綁架了。但是總體來說,OOP 是可以幫助我們思考與增進品質的。

沿著這樣三階段的脈絡,能夠讓人在思考時,像漏斗一樣逐漸收斂範圍,從比較宏觀的架構到程式碼安排,最後是程式碼撰寫。希望這篇文章能夠幫助還在摸索 Rails 的人。