Ruby學習筆記-1

最近在學習Ruby這個程式語言, 學到現在覺得這個程式語言與我常用的ObjectiveC有許多相似性, 所以在這邊做個摘要整理
  1. 多重繼承的解決方案: 松本行弘在這本書裡面比較了C++, Java等程式語言的多重繼承問題, Ruby是使用Mix-in來實現多重繼承, 那麼ObjectiveC呢? 以我觀察, ObjectiveC是使用Protocol來實現多重繼承, 而且ObjectiveC的protocol與Ruby的Mix-in的概念幾乎一模一樣, 但是不太一樣的是Ruby使用Module來宣告Mix-in的介面與實作, 而ObjectiveC僅使用@protocole來宣告protocole的介面, 實作上必須在使用這個protocol的Class來實作, Mix-in是將許多物件的共同行為抽象化, 但是這些物件並不一定是繼承至共同的類別. 從C語言的觀點, Mix-in可以當做是共用的Module, 或是static function. ObjectiveC的protocol可以為既定的類別衍生出介面, 並可在run time來判斷與呼叫, 所以不同類別的物件也可以擁有同樣的Protocol. 從以上比較, Protocol無法做到實作的抽象化與重複使用, 這應該是跟Ruby本身是動態型別支援有關. Protocol也許也可以做到, 但是要花一些工, 作法也許類似要在Protocol中去使用抽象類別衍生的物件, 這方面的技巧跟C++ abstraction class與Java interface應該是一樣的
  2. Metaprogramming: Ruby可使用語法來動態產生方法, 在ObjectiveC 2.0也有類似的語法, 就是property, 使用property可以省下許多寫setter與getter的物件存取方法的code, Ruby則使用了attr_accessor. Metaprogramming還有許多用法例如Reflection, Reflection我也是最近兩年才知道的技術, 並沒有太多使用經驗, Java, ObjectiveC都有支援
  3. 動態型別: ObjectiveC與Java都是靜態型別程式語言,必須嚴格指定變數型別, 在編譯時可指出錯誤的型別指定錯誤, Ruby則沒有這種限制, 但是Ruby會在runtime時去做型別判斷, 這部份ObjectiveC和Java都有支援動態型別檢查就是了差別在支援的層級,與直不直覺的問題, 這邊Ruby作者引用了一個西方格言 "如果它走起路來像隻鴨子, 叫起來像隻鴨子的話, 那它就是隻鴨子) , 其實C++, Java ObjectiveC也可以做的很 "動態" 但是必須從 "設計" 下手, 例如你必須先抽象化, 將介面 or Protocol定義出來, 可以在runtime時依據型別是否有支援這些介面 or Protocol來呼叫對應的function, 但是這些 "動態" 必須由programmer精心鋪陳才能做到, 但是Ruby在程式語言本身就支援, 也許可以少掉許多設計的工, 不過如Ruby作者講的這也會犧牲一些效能, 支援動態語言派幾乎都會說的一句話->現在的CPU越來越快, 效能不是太大問題. Ruby的作者也說了類似的話:-)
以上是我學習Ruby程式語言到目前的心得, 學習Ruby主要還是為了在Web端的開發, 所以將Ruby語法與程式語言的理念搞懂了, 下一步就是學習Rails這個最近這幾年很紅的Web MVC framework, 也許你會問為何不用Java的framework ?? 如果以程式語言熟悉度, 我熟悉Java勝過Ruby, 但是我覺得Java開發Web的framework太複雜了, 之前學過Spring, 剛開始IoC還可以, 但越看到後面,越覺得複雜, 現在忘的一乾二淨XD, 還有觀察到一些Java衍生出來的技術都在學Rails, 例如Grails, Play framework, 可見Rails這個框架有它值得學習的地方.




留言

這個網誌中的熱門文章

我的Kindle 2支援中文顯示了

[ ChatGPT 與你分享好書 ] 超級預測

免費的最貴?