作者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