作者brianhsu (坟墓)
看板PLT
标题Re: [比较] 简单的 Java/Python/Ruby/Scala 比较。
时间Fri Jan 8 09:07:28 2010
※ 引述《PsMonkey (痞子军团团长)》之铭言:
: 我不是来护航的,不过被认为是护航的也无访
: 起因是因为这篇文章我看了很久都看不懂
因为这篇是从影片延伸的,所以有些地方我略过了,另外
其实影片有些地方我不认同,不过我没提出来。
这里只是很无聊地把影片里的例子原封不动的搬出来而已,
所以也没啥护航不护航的。
基本上,我认为那个影片作者的想要表达的重点只有一个:
Java 是个 super verbose 的语言,在可以的情况下快点跳
船吧。XD
另外,他还有另一个影片也很有趣:
http://oodt.jpl.nasa.gov/better-web-app.mov
是在讲 Web framework 的,里面的口号是 We Love J2EE!XD
: 如果今天比较的论点在於
: Java 要自己写一堆 getter/setter
: 而其他三种语言不用
: 那我不置可否
: 用 Eclipse 的 getter/setter generator 的人好像没啥资格讲话 XD
影片里有一个论点:程式码阅读的次数比撰写的次数多。
我们不在乎写一堆 getter/setter,但在阅的时候会产生很多
噪音,造成阅读上的困扰。
: : 到这边为止,Python / Ruby / Scala 还是不算完全打败 Java,毕竟 Java
: : 也才九行程式码,Ruby 也要七行。
: 如果你不用符合 JavaBean 的 spec
: 没有引数的 constructor 可以省略
: (lat, lon 的 field 宣告部份也可以合成一行→无意义 XD)
这里是为了保持各种语言实作出来的行为一致性,提供一组
default constructor,lat/lon 会是 0,但同时也提供另
一组做初始化,所以没办法省。
在这边 Python / Ruby 都是用 default argument value 的
方式做,Java/Scala 则是提供另一组 constructor。
PS.Scala 2.8 开始也可以用 default value 了。
: : 重点是下面了,现在我们发现原来的设计有问题,因为 lat 不能小於 -90
: : 或是大於 90 ,我们要如何在不更动原有的客户端的情况下,把这个判断加
: : 到我们的函式库呢?Python / Ruby / Scala 都可以很轻松的做到。
: 基本上 Java 的教科书(忘记官方 coding style 有没有这样建议?)
: 都会告诉你去写 getter/setter 来存取 field
: (所以这几天在写 GridBagLayout 的时候还颇惊讶 XD)
: 你不用 setter 来设定 lat 的值
: 然後说的好像 Java 作不到
: 跟抱怨「Java 里头不能操作指标很麻烦」的感觉差不多
: 只能说... 我的功力太低,实在不太懂...... Orz
影片里在强调这两点:
* Code is read more than written
* We are all consenting adults.
解释:我们知道自己在干啥事,所以所有的 field 都是 public。XD
而第二点造成了 Python 的可阅读性。
当然,第二点其实我自己不是很认同就是了。
我们当然可以在 Java 里用 getter/setter(影片里一开始的作
法),但会从 9 行程式变成 21 行,成为影片里说的 super
verbose,然後别忘记第一点:Code is read more than written.
但如果我们要用破坏封装来达成简洁,就无法达到上面说的当你
有一天发现程式有问题时,可以不用动到客户端的 code 来做修
正了。
这里只是简单的指出在客户端的程式码是相同的情况下(都不使
用特殊的函式),如何能够达到相同的效果,而结论是 Java 本
身是做不到的。
这是程式语言设计上所采用的哲学的问题,在这里 Java 很明显
的喜欢 getter/setter,而其他三个语言比较偏好 properpty
的做法。
其实没啥好坏之分,只是设计的哲学不一样,但就像你说的,我
也很讶异我在 Android 会看到用 public field 来操作的情况
出现。
Notification 就是一个例子,他有很多 feild 是 public 的。
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,让你也可以让你在某些情况下使第一行
消效。
Ex. 可以用 coord.lat 读值,但不能用 coord.lat = 来指定值。
不过这都只是个人偏好就是了。
只能说,习惯了 Ruby/Scala 的简洁,回头写或看 Java 程式码
有的时候会很觉得痛苦就是了。由简入奢易,由奢返简难啊。XD
--
~
白马带着她一步步地回到中原。白马已经老了,只能慢慢地走,
'v'
Brian Hsu 但终是能回到中原的。江南有杨柳、桃花,有燕子、金鱼……
// \\
( 坟 墓 )
/( )\
但这个美丽的姑娘就像古高昌国人那样固执。 【白马啸西风】
^`~'^
http://bone.twbbs.org.tw/blog 『那都是很好很好的,可我偏不喜欢。』
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.120.199.114