2011年4月2日 星期六

圖解:物件=資料+方法
illustration: object = data + method


學習一套程式語言,要學到融會貫通的地步,才能夠真正幫上自己的忙,然而,真要到那個地步,是非常花時間的。對於我這種利用閒暇自學程式設計的業餘人士來說,學習之餘,必須兼顧目前的工作,時間很有限。於是,到底要把時間投資在哪一套程式語言上面,就變成很重要的一件事情。

剛開始的時候,我看 O'Reilly 的 Head First Programming ,這本書是以 Python 做為範例而撰寫的,加上我自己又是 Google fan,因此,自然很先入為主的變成了 Python 小信徒。不過,身為一個很懶人的電腦使用者,難免會覺得寫 Python 好像有點煩,有點不夠懶,總覺得似乎該讓電腦代勞更多事情才對。

中間,去參加了中研院自由軟體鑄造場所舉辦的工作坊(課程幾乎都是免費的喔),整整兩天的 Python 教學課程,講師是跟我一樣從第三類組轉行的前輩 XD 結果,上完課沒多久,前輩就從 Python 陣營跳槽去 Ruby 陣營了,囧。

於是我就跟著開始接觸 Ruby 。

似乎許多人跟我一樣,在 Ruby 跟 Python 之間搖來擺去,隨便就可以 Google 到一堆 Ruby 跟 Python 的比較文章,然而,大多是兩派各說各話的情況。最後,看到這一篇 What Programming Language to Learn (Next) ,才真正下定決心把時間投資在 Ruby 上。

簡單的說,對於程式設計新手而言,往 web 方向走的話,就是 Ruby (因為之後可以學 Rails),不然就是 Python。



Ruby 官網上,有簡單、易懂、可愛的入門教學,不過,這種「淺顯」的教學,對程式經驗少得可憐的人來說,反而沒有幫助。因為,我沒辦法像寫過 C 或 Java 或其他程式語言的人一樣,一邊看,一邊自動聯想到一堆相關經驗拿來比較。尤其是 Ruby 的語法非常簡潔,非常抽象化,沒辦法從語法本身推敲出背後的運作原理,所以,反而越看越是一頭霧水,到最後,我甚至有股想要去翻閱 .c 原始碼的衝動。

結果,最適合菜鳥看的書,不是那些甜蜜蜜的新手教學,反而是「松本行弘的程式世界」,也就是 Ruby 發明者 Matz 所寫的書。(意外吧)


Matz 在「松本行弘的程式世界」中,清楚完整的說明 Ruby 語言的設計理念。程式語言畢竟是工具,先有需求,才會創造工具,再有需求,才會改良工具,而 Ruby 就是 Matz 精心改良出來的程式設計工具。以一個圈外人的眼光,單看這個複雜的工具,會不明所以,但是,當我了解它是在什麼樣的背景時代下、為了解決什麼問題而設計、為什麼從幾種作法中選擇了這種作法,我才能夠了解「這個工具可以做什麼、該怎麼用、最好怎麼用」,也才能夠擴展自己的腦內世界,然後把 Ruby, C, C++, Java, 以及其他經典程式語言,放到適當的定位上。

雖然「定位」這個動作,看似跟學習 Ruby 本身毫無關聯,但是,很神奇的是,只有在定位完成後,我才能夠在腦袋清楚的狀態下,專心潛入語法細節中,而不是像之前那樣霧裡看花、瞎子摸象,浪費許多時間。

「松本行弘的程式世界」是博碩出版的。博碩出版的書一向排版很好看,它挑選的書籍,邏輯架構跟我的思考結構很相近,所以內容很好吸收,而且,日文翻中文翻譯的非常好,是我最喜歡的出版社。(PCuSER 其次,旗標幾乎只買 MdN 系列的翻譯書,至於松崗跟碁峰,太醜了,我連封面都看不完囧)

回到文章開頭放的圖,這是我看「松本行弘的程式世界」時,一邊做的筆記:物件=資料+方法。不知道有沒有人跟我一樣,對於物件感到困擾,常常聽人家說物件就是一個「東西」,這種解釋很抽象,照這樣說,那我也算是個東西啊...而 Matz 倒是很輕鬆的解答了我的疑惑。

這張 Ruby 筆記中,橘色部份的字是識別用的物件 id,是一串數字。藍色部份是 Ruby 物件的資料型態與變數,類別變數前面有兩個@,實體變數則是一個@。綠色的是方法名稱。這些東西都是小寫,沒記錯的話,Ruby 裡面只有類別名稱是用大寫的。

以上,就是這張 Ruby 筆記的圖片說明 XD