Re: [比較] 簡單的 Java/Python/Ruby/Scala 比較。

看板PLT (程式語言與理論)作者 (godfat 真常)時間15年前 (2010/01/08 17:11), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串10/11 (看更多)
※ 引述《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

01/08 21:21, , 1F
請務必試試 Haskell... +1
01/08 21:21, 1F

05/09 01:28, , 2F
講解的超詳細的啦!!
05/09 01:28, 2F
文章代碼(AID): #1BHlQa2b (PLT)
討論串 (同標題文章)
文章代碼(AID): #1BHlQa2b (PLT)