作者godfat (godfat 真常)
看板PLT
標題Re: [比較] 簡單的 Java/Python/Ruby/Scala 比較。
時間Fri Jan 8 17:10:57 2010
※ 引述《brianhsu (墳墓)》之銘言:
: 基本上,我認為那個影片作者的想要表達的重點只有一個:
: Java 是個 super verbose 的語言,在可以的情況下快點跳
: 船吧。XD
其實 Scala 也是 super verbose, 和 Haskell 相比 :p
我目前沒看過能寫得比 Haskell 還簡潔的語言。
就算是 dynamic typing 也不見得能比 Haskell 簡潔。
(為了 type safe, static typing 天生上會比 dynamic typing 來得 verbose)
: 影片裡在強調這兩點:
: * Code is read more than written
: * We are all consenting adults.
: 解釋:我們知道自己在幹啥事,所以所有的 field 都是 public。XD
: 而第二點造成了 Python 的可閱讀性。
: 當然,第二點其實我自己不是很認同就是了。
說到 public/private 的事情,在 Ruby 裡,
client 可以很輕易地跨到 private 的區段。
我想會有很多人說,這樣就沒有意義了。不過呢,
我個人是覺得這仍然是很必要的事情。有點像是區分
design defined behavior 和 implementation defined behavior.
至少你要讓 client 很明確地知道某個 method 是 private,
可以的話,請盡量不要用,未來很可能改變,甚至消失。
畢竟無法避免的,library or framework 也是會有 bug 的。
多少需要提供一些補救之道。類似這種感覺。但會不會因為能夠補救,
而使得 library or framework 實作者,皮繃得比較鬆散呢? XD
這大概就會像 poga 板友所提到的:
: 什麼政治宗教經濟因素拿出來討論就真的沒完沒了了...
不過我是覺得偶爾提一下也無妨啦 :p 不要死纏爛打就好了... 謹記謹記
: 這是程式語言設計上所採用的哲學的問題,在這裡 Java 很明顯
: 的喜歡 getter/setter,而其他三個語言比較偏好 properpty
: 的做法。
其實我是覺得沒什麼差別。重要的差別在於兩點:
1. function/method call 可否省略 () ? 可的話,method 看起來也能像 data.
2. 能否有一定程度的 operator overloading? 可的話,a.b = c 也可以是 method.
第一點決定了 getter 的外觀,第二點決定了 setter 的外觀。
在 Ruby 裡,也只是 meta-programming 的應用而已。因此算是某種
syntactical 上的 sugar.
能不能省略 (), 我覺得也牽涉到一個議題。假設我需要取得 lat method
本體怎麼辦?我不確定在 Python 裡所謂 property 的狀況,
但一般 function 下,不打括號就是 function 本體。(應該吧?)
這點和 ECMAScript 是一樣的。然而在 Ruby 中,因為 () 可以省略,
因此這種作法是無效的。取而代之的是,呼叫另一個 method.
coord.method(:lat)
以此取得 lat method. 這似乎就顯示出不同的主導方式:
在 Python / ECMAScript 中,data 是本體。寫:
obj.method 是回傳 method 本身,對他使用 () 則是呼叫這個
method obj 的某個 function.
然而在 Ruby 中,沒有任何方法可以直接取得某個 obj 的 data.
所有的 點 什麼東西,全部都是 method call. 因此要取得 method 本身,
也得透過另外一個 method 了。
一開始我比較喜歡 Python / ECMAScript 的方式。不過現在我比較喜歡 Ruby 的
方式。因為其實需要取得 method 本體的機會比需要 method call 來得少。
那麼當然是能省略就省略。另一方面,則是用了 Haskell 後,不喜歡括號 :p
: BTW,我個人比較喜歡有 Uniform access 的這邊,我個人覺得
: 用 property 的方式,可以很明顯的告訴你『你改掉了某個值』。
: val coord = new Coord (10, 20)
: coord.lat = 20
: coord.setLat (20)
: 在第二行裡我可以一眼就看出來我改了 lat,值是 20,而不是
: 像第三行先看到 set,所以知道我在改值,接著再看 Lat,拼
: 湊出『我在改 lat 的值』的簡單的事實。
: 我知道這和 Java 世界裡的觀念有所差別,不過我比較喜歡第一
: 種的作法。
: 而 Ruby/Scala 的好處是由於有 uniform access 你可以很簡單
: 的控制 getter/setter,讓你也可以讓你在某些情況下使第一行
: 消效。
Ruby 和 Scala 在這邊有不小的差異,在於就像我上面提到的,
在 Ruby 裡,一切都是 method call. 而 Scala 還是把 data 跟
method 混在一起。因此這邊確實會有 coord.lat = 20 的語意改變。
在 Ruby 中只是單純不同 method 而已。
Flash 的 ActionScript 3 可以這樣寫:
var lat_: int; // data member, field, instance variable, whatever term
function get lat(): int{ return lat_; }
於是寫起來也會是 coord.lat 呼叫上面的 lat() method.
這種方式跟 Scala 會比較像一點。
: 只能說,習慣了 Ruby/Scala 的簡潔,回頭寫或看 Java 程式碼
: 有的時候會很覺得痛苦就是了。由簡入奢易,由奢返簡難啊。XD
請務必試試 Haskell... XDXD
--
In Lisp, you don't just write your program down toward the language,
you also build the language up toward your program.
《Programming Bottom-Up》- Paul Graham 1993
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.160.129
1F:推 jaiyalas:請務必試試 Haskell... +1 01/08 21:21
2F:推 lanyitin:講解的超詳細的啦!! 05/09 01:28