关于 ruby 和 rails

2011-09-11 11:30:39 +08:00
 Los
https://gist.github.com/1209128
4917 次点击
所在节点    Ruby on Rails
46 条回复
Los
2011-09-11 11:32:31 +08:00
Los
2011-09-11 11:36:53 +08:00
悲剧了,还以为嵌入代码也可以如 https://gist.github.com/1209128 这里一样直接显textile的格式呢。
kaktos
2011-09-11 12:02:27 +08:00
ruby的做法是想创造出一种灵活的DSL类语言,不过这灵活性也是双刃剑啊。不过抛开语言来讲,我还是觉得rails是地球上最fashion的MVC框架,至于效率是不是最高,我就不引起争论了:),用过的人都知道。。。一些理念,包括activerecord,restful风格,都是rails率先将理论引入实践的,加上最近3.1搞的什么assets pipline,coffeescript之类的东西,如果你是个干时髦的年轻人,不管平时是搞java或者php或者python,我觉得你都至少可以从rails里面学到不少东西,开阔不少视野呢~~
chloerei
2011-09-11 13:52:04 +08:00
总的来说就是偏见,自己的领域玩得越熟,踏进别的领域就越被思维定势困住。如果是有心跨领域探索的,要放开心态,遇到问题可以问一问,不要自顾自用用老办法。

我想到这样一个场景,一个人去KFC点餐

“我要单点一个汉堡,一份大薯条,一杯大可乐”
“不如你试试我们的套餐,可以有节省3元”
“套餐的可乐是中可乐不是大可乐啊!”
“可以换大可乐,还是比原价节省2元”
“我要大薯条不要中薯条!”
“换大薯条也是比原价节省2元”
“汉堡是XX堡么?”
“是一样的”
“你们套餐的汉堡肯定偷工减料的……我就是要单点”
“先生……”
“怎么这么罗嗦,隔壁M记从来不干预我单点的,我回他们那了”
keakon
2011-09-11 14:06:01 +08:00
@Los 那篇文章如果你读完的话,就知道我并非只是抨击RoR。我真正想说的是各种东西都有其适应的群体,开发者应该拿有限的时间去找适应他的技术,而不是逼自己去适应技术。


拿其中一个观点来说:Pythoner极力维护语言的纯洁性,简洁易懂是他们的哲理;Rubyer很喜欢新奇,巴不得每行代码都能用6种语法来写。

以你上面的为例:“Ruby允许一个函数可以有多个别名,比如得到 Array 的长度,有size,length甚至count”。

那么Python为什么不这么做?因为它需要简洁,这种简洁也带来了一致性和通用性,可以减少人们的疑惑和学习负担。
试想一下字符数组,它在C语言里可以当成字符串。前者或许可以有size,length甚至count,但是后者有count合理么?而在Python中,不论是内置的list、set、str、unicode、dict,还是开发者自定义的类型,一律都用__len__(self)这个接口获取长度,而且这个命名也让你趋向于选择更短的内置函数len()。

为什么要用函数而不是对象的方法?
我不知道Guido设计的初衷是怎样的,但是如果一个函数只想接收定义了__len__(self)方法的对象时,len()可以让不支持的对象抛出异常。而如果换成size(self)、length(self)和count(self)方法的话,你在定义自己的类时,为了不与标准的接口相冲突,这3个方法你都不能定义。于是你不能有square.size、rope.length和money.count,除非你保证其他人不会把这些对象当成Array。

我承认你的例子里用count确实更符合语境,但在Pythoner看来,作为一门语言的基本类型,它应该保持简洁;而在开发者需要他的语境时,才去自行定义别名。
而在Rubyer看来,他们只知道__len__很丑,len不面向对象,而且没有alias语法,这太过死板和沉闷了。


关于那个“:attachable_id=>topic_id”,我只想说人类的语言不会带:和=>。不管你学过多少门语言,只要没学过Ruby的人都看不懂这些符号。
而Python极力避免使用符号,宁愿使用关键字来取代符号。


还有我之前所提到的,那个.save让人疑惑究竟是一个属性访问,还是一个方法调用。一个get方法模拟成属性说得过去,可是这种带有强烈副作用的方法,为什么要伪装成人畜无害的样子?
假如这个对象还有个saved属性,然后你在获取它时碰巧少写了个d,而这个save方法最后会返回saved属性,会出现什么现象呢?你也许会说我有写单元测试啊,可假如你的测试代码是save == saved,或者这个错正好就发生在单元测试里呢?


我想这3点差异的本质就是:Python追求简洁,不让人疑惑;而Ruby追求自由,让自己惬意。
这也是我说“真正的Python程序员和Ruby程序员肯定是2个极端,绝对是水火不容的存在”的原因。他们的观念和care的方面完全不一样。
更多原因可以看这篇文章,有些观点现在看来存在错误,但大方向上和我现在的看法仍然相符: http://www.keakon.net/2009/03/17/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E9%80%89%E6%8B%A9Python%EF%BC%8C%E8%80%8C%E9%9D%9ERuby

其实回头想想,这有点像iOS和Android的差异。很多人想把iOS当成Android用,然后觉得很不灵活。可问题是2者本来就是风格迥异的,不适应就换一个,何苦折腾自己?


关于你的PS.2,这并不能解决根本原因,如果想用mootools呢?
keakon
2011-09-11 14:19:21 +08:00
@chloerei 我想说的是我在接触Python后没多久,就喜欢上Ruby了,详情可以看 http://www.keakon.net/article/888

但随着了解的深入,就越来越觉得不爽了。

我可以轻易为JS和Python抛弃学了4年的C++,但却忍受不了Ruby,这实在很难以偏见来说服我自己。
chloerei
2011-09-11 14:20:26 +08:00
我最反对的就是这句:

“Python追求简洁,不让人疑惑;而Ruby追求自由,让自己惬意。”

说得好像Ruby不追求简洁,让人迷惑似的。你提出的语法问题在实际开发中未曾成为问题,不一一反驳了。
chloerei
2011-09-11 14:42:15 +08:00
还是挑几点说好了

1. 方法名和属性名

实例变量(对象的属性)都是以 @ 开头的,比如 @name,默认情况下只能在对象内部可见,要在外部访问,必须设置相应的方法。所以熟悉 Ruby 的人,肯定知道 foo.bar 这个 bar 是个方法,如果它有对应的属性,那么可能会命名为 @bar

你举例的 (@)saved 属性,从命名上看是布尔值,按照惯例,访问方法应该命名为 saved?

2. 方法的别名是开发者对语言和框架作者的适应。

也就是 Matz 和 DHH 为某方法设置了别名,那么想用就用好了。如果团队里面有人乱搞别名,要不人留下代码不留,要不人和代码都不留。

3. 人类语言本来就没有 hash。ruby 1.9 引进了 json 式的 hash,比如 { foo: "bar" }

跟2一样,不想用可以不用。

4. mootools 想用就用啊,该怎么用怎么用。最简单粗暴的拷进 public 目录用 <script src=..> 引进去。Railsful 一点的打包成 gem,用 assets pipline 跟其他js代码一起打包,减少 http 连接数。

奥,已经有人做了 https://github.com/neonlex/mootools-rails
args
2011-09-11 14:44:20 +08:00
我觉得ruby只有两个地方比python更让我满意:
1) 块结构, 给函数传入一个块的思想真的很强大。
2) 丰富的内建自省机制,提供强大的原编程基础。

其他的地方我觉得都比python烂。例如ruby强调面向对象,但method原生不是对象;def和class会定义一个封闭的作用域,不能方便的访问外部变量。以及各种奇怪的语法。

ruby从perl继承了一些好东西,例如if和else定语还有正则表达式字面量等等,但也继承了太多无用的东西。
Los
2011-09-11 14:45:55 +08:00
@keakon 其实rails你里面的东西很多都可以换的,早两年前我就用jquery了。

----
而rails采取了「MVC制」的web开发框架,「约定胜于配置」的本质意义在于「规划部门」,将「部门」确定下来并将「各个部门该负责干什么确立下来」,但这里它会「预先安排好一支精干的工作人员队伍」,免得你这个「头」对着这个空壳机构无处下手,无事可做。
bhuztez
2011-09-11 14:52:41 +08:00
@args 其实python也可以用 __metaclass__ 来 meta programming 的
keakon
2011-09-11 14:52:54 +08:00
@chloerei 我很不乐于和Rubyer讨论语言,原因前面也提到过了。
所以只简单回答下,我希望你有反对意见的话,先站在对方的观点想想为什么会存在这个问题,而不是把别人当成无理取闹的异类。

我就经常很疑惑,我自己就是证人,哪怕全世界只有我一个人疑惑,也是“让人疑惑”。同理,你也只能证明你自己不疑惑,不能证明它不“让人疑惑”,这在海猫中属于恶魔的证明。
要我说的话,我不认同“在实际开发中未曾成为问题”。我看到那条语句就得猜测是不是函数调用,这么大的问题都不是问题的话,那我把save改成一个属性,你在阅读代码时是否还按照“约定”认为它是函数调用?

关于“不追求简洁”,如果你注意到我的用词了的话,我对那么有好感的Ruby的第一印象不是简洁,而是简约。这2个词在Rubyer眼里也许看不出区别,这更让我觉得当初用这个词用对了。


@Livid 载入github的内容严重拖慢页面加载速度,能改善下吗?
Los
2011-09-11 14:53:58 +08:00
感觉语言之类的喜好还是归于自己的观感,你心目中它是什么样子,往往决定你能不能喜欢它。
萝卜青菜各有所爱,也不非得大家都喜欢同一门语言。


记得N年前还是在win下进行桌面开发,我就非得用SDK自己一字一字自己敲桌面程序(好吧,还有更底层的),MFC之类明明用起来很快但内心处极度不喜欢,这一种感觉
args
2011-09-11 14:56:14 +08:00
不过框架的话,rails真的是我见过里最完整好用的。当然我以前大框架只用过django(php的话简单接触过zend),接触的其他python框架则类似与wsgi的封装,算不上full stack。

不过rails是不是真的很慢啊,我目前自己写了个小论坛程序玩,看到控制台输出居然用了400多毫秒(大部分都花费在active view上),而我对比其他的大规模的php论坛,也就几十毫秒。
Los
2011-09-11 14:57:19 +08:00
@args 建议在production下试试看
bhuztez
2011-09-11 14:57:37 +08:00
@keakon 在method的调用上,Ruby是类smalltalk语法,你熟悉的是类C语法,其实没啥区别,习惯了就好。各有各的好处,类smalltalk语法,可以让 Ruby 有block,可是类C语法,可以让你更方便地把 method 当参数。
chloerei
2011-09-11 15:01:30 +08:00
@keakon 前面有跟帖了。save肯定是方法,方法有问题,找方法的编写者。

简洁简约用来描述语言有啥语境区别我只能请指教了。

你对 js 库的理解倒让我觉得还未做到理解 web 开发的本质啊。

我也不太喜欢面向非 Ruby 人群讨论 Ruby,因为发现有些偏见根深蒂固很难改变。
Los
2011-09-11 15:02:27 +08:00
@chloerei @keakon 一开始这话题我就相当怕会引起争论,为此将内容直接在github里,一方面是以为直接支持Textile的输出,一方面是为了引起争论时候可以直接删除此内容。

这篇内容一是说下ruby在自己内心中的样子是什么,为什么要那么写。
二主要为rails的「约定胜于配置」正名,很多人对于rails的「约定」的认知过于偏差了。
keakon
2011-09-11 15:03:54 +08:00
@chloerei 我明确说出来吧,省得你还搞不懂我们观念上的根本差异:你希望的自由,是不想用可以不用;但我希望的是不想用的,我要求全世界所有人都不能用。

我承认这样很霸道,所以才会提起iOS。观念和乔布斯相符的,会满意iOS,不符的可以去选择Android。2者本来就都没有错,只在于你是否选择和你观念相符的。
Los
2011-09-11 15:18:41 +08:00
@keakon 「但我希望的是不想用的,我要求全世界所有人都不能用。」汗,你这句话让我想起了广州这边前段时间闹得纷纷扬扬封杀粤语事件,普通话进来了,连本地电视台也要求只能用普通话进行播放,非一家语言独用为好。:)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/17993

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX