锁定老帖子 主题:php,rails和java的有趣比较
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-12
floating 写道 关于RoR维护成本,TTS上的讨论也热火朝天。http://www.theserverside.com/news/thread.tss?thread_id=43020
目前国内除了JavaEye还有没有其他比较成熟的RoR应用?如果有的话,robbin兄可以联络大家聚在一起讨论一下目前系统的可维护性究竟如何。 JavaEye 也只是一个很简单的应用啊。。。拿这个应用不能代表RoR 的全部吧。。 |
|
返回顶楼 | |
发表时间:2006-11-13
http://blog.csdn.net/mfowler/archive/2006/08/16/1069927.aspx
引用 我做设计时,经常借构建一套DSL的思路来类推——有意把class和方法设计成DSL的样子。不论用什么语言,我都尽量这么做,...... 什么时候需要把DSL和主语言划清界线,我认为这个问题的答案因主语言而异,用Smalltalk时我几乎从没感觉有必要分离出一种DSL来,而这种需求在用C++/Java/C#时则非常常见。 ...... ...我喜欢用Smalltalk和Ruby的程度比喜欢用Java或C#的程度高那么多,其原因我总是觉得难以言传,最常听到的解释是静态类型与动态类型的区别所致,但我总觉得这个说法并没有抓住要害,更接近两者区别本质的是它们对构建内部DSL友好程度的差异。 Martin Folwer的意思就是说当他用Java/C#的时候,编程语言表达能力会影响到他思考业务逻辑的构造,而Lisp/Smalltalk/Ruby则不会让他在思考业务逻辑构造的过程中分神去思考编程语言的表达问题。 通俗一点来说吧,就是说,Java/C#的次要复杂度问题比较高,它会让你分神,把你本来应该放在思考业务逻辑上面的精力分出来。而ruby则不会让程序员分神去思考这些次要复杂度的问题,可以集中精力考虑业务逻辑构造。当然一般来说越高级的脚本语言,次要复杂度问题越低,例如我认为最牛的脚本语言就是Unix Shell,我的最爱,经常一条命令搞定ruby需要写几十行代码才能完成的任务。 引用 我想这可以从两方面来看。 一是工具支持,包括设计工具、IDE工具、白盒测试工具等。动态语言在这方面我想和静态语言能向工具提供的信息量上还是有差距的。(是不是RoR采取了某种巧妙的思路,可以很好的解决这个问题?因为我还没有对RoR的运行机制做了解,所以不好轻易说RoR在这点上有先天的劣势,姑且从另一个角度,也就是目前的确还没有得到充分的支持这个层面上说吧) 二是第三方开发包的支持。像Java,C等语言之所以取得辉煌的成功,和它提供的丰富的第三方开发包是有很大的关系的。而静态语言相对比较封闭的特点,使得第三方开发包对代码的侵害性可以降到很低。动态语言在这点上表现的就比较差,我想大家都有过从网上下载某个JS包,然后放到项目代码里发生冲突的经历。RoR是否能很好的解决这个问题呢? 再次声明,本人刚刚接触RoR,只是有比较多的PHP、JSP和JavaScript的经验而已。 脚本语言的IDE重构能力差一些,其他方面好像也不差些什么功能;不过我好像没有听说哪个C语言的IDE重构能力很强的。 python的package管理做的比ruby好,而且python的第三方库也异常丰富,这方面丝毫不比Java差。当然ruby这方面做的不太好。 所以我真的很置疑这种观点,认为静态语言适合大项目,复杂逻辑,长生命周期,我觉得没有什么强有力证据能够说明这个观点。你说那么多银行项目,业务逻辑都是用PL/SQL写成存储过程的,那么多ERP平台上面开发都是ABAP,这些不都是脚本语言吗? 《Programming ruby》这本书里面也谈到了这一点,认为静态语言对于大项目的组织,复杂业务逻辑的实现并没有人们想像中那么高。 我个人认为静态类型语言的优势就是执行性能高,其他方面要说有优势,都有值得争议的地方。 |
|
返回顶楼 | |
发表时间:2006-11-13
floating 写道 再回答一下robbin兄的几个问题。
引用 如果说软件业务逻辑复杂度是10,Java编程带来的次要复杂度就是50;RoR把次要复杂度降低到了10。
我想robbin兄说的“Java编程带来的次要复杂度就是50,RoR把次要复杂度降低到了10”这个观点师针对原始的Java语言和原始的RoR进行比较的。的确,如今的Java语言体系太过庞大,如果不采用任何framework开发项目,Java的学习成本和使用成本都比较高。但是目前估计没有哪种语言会有Java这么多的framework,在确定好使用适当的framework开发适当的项目之后(确定适当的framework并不是件轻松的工作。还好,一般的公司做从事的项目都有一定的延续性,前一个项目确定好了framework,后续的项目基本上可以拿来用),我想语言本身的复杂度应该没有50比10这么高吧?当然,我没有用RoR开发过正规的东西,这点上没有什么强有力的发言权。 引用 为什么静态语言在复杂业务逻辑,大型商业系统,长生命周期应用当中有非常强的优势呢?理由是什么?
我想这可以从两方面来看。 一是工具支持,包括设计工具、IDE工具、白盒测试工具等。动态语言在这方面我想和静态语言能向工具提供的信息量上还是有差距的。(是不是RoR采取了某种巧妙的思路,可以很好的解决这个问题?因为我还没有对RoR的运行机制做了解,所以不好轻易说RoR在这点上有先天的劣势,姑且从另一个角度,也就是目前的确还没有得到充分的支持这个层面上说吧) 二是第三方开发包的支持。像Java,C等语言之所以取得辉煌的成功,和它提供的丰富的第三方开发包是有很大的关系的。而静态语言相对比较封闭的特点,使得第三方开发包对代码的侵害性可以降到很低。动态语言在这点上表现的就比较差,我想大家都有过从网上下载某个JS包,然后放到项目代码里发生冲突的经历。RoR是否能很好的解决这个问题呢? 再次声明,本人刚刚接触RoR,只是有比较多的PHP、JSP和JavaScript的经验而已。 其实企业级应用和语言好坏没什么关系,只有应用够多,时间够长。比如Php这么糟糕敖了10年还是被Oracle承认为企业级。Cobol, SAP的ABAP(这个是脚本语言)也一样,这种应用没有选择别的语言的权力。这也和静态还是动态没有关系。 说起IDE和第三方库,几乎每个新来的语言都要经过这两道坎才能’十年媳妇敖成婆‘。不过毕竟还是有影响的。 但是设计本身能简化程序员工作量的语言对IDE的依赖低于那些面向IDE设计的语言。典型的例子是java的xml配置:xml的可读性是针对程序的,而不是针对人的。当初的设计者恐怕认为借助于IDE工具配置xml轻而易举,结果我们也看见了。另外一个例子是IDE的方法参数提示,这个功能本身很好,但是对支持命名参数和默认值参数的语言来说就根本是多余的了。 至于第三方库,你说的冲突和命名域有关,和动静态没什么关系。Ruby支持命名域(有些办法可以打破这个,所以偶然rails的某个plugin可能造成冲突,当然这也和不好的plugin编程习惯有关)。退一步说就是没有命名域的Php也是企业级了。其实第三方库确实是阻碍新语言或者技术推广的主要障碍,有时候因为要用某个库你根本没有选择的余地。 |
|
返回顶楼 | |
发表时间:2006-11-13
Godlikeme 写道 很抱歉,我一直对robbin的说法将信将疑,但似乎你很确认。如果你认为这是Sun的人做的,数据可信度不高,这没什么问题。我也没有说会相信Tim Bray的数据,只是请robbin帮分析下。为什么会有这种差距, 摆事实讲道理才能让人信服。相比较来说,我更相信Tim一点。 BTW, It is funny that the people who imediately jump to Java's defense have never tried any of the alternatives, like PHP or RoR. We all need to keep an open mind. 如同上面这句话所说,似乎你一直以一个java的支持者看待我所提出的问题,很抱歉,不是这样的。 似乎我应该退出这些关于ruby,java,php的讨论,自最初我也没觉得讨论这些从纯技术角度有什么重要意义。 说太露骨就是利益集团的政治斗争,已有的既得利益者和未来的争食者。看java能不能倒下、ruby这杆大旗谁能先扛起来了。呵呵。静观其变吧。 这里的常客都知道我几乎不在java版发言,我的钻石都是在ruby版赚的。被你说成’一直支持java'实在有够郁闷。 既然你已经意识到这种X vs Y的讨论技术的因素是次要的何必还计较那些数字呢?呵呵,相信自己的感觉吧。 |
|
返回顶楼 | |
发表时间:2006-11-13
cookoo 写道 至于第三方库,你说的冲突和命名域有关,和动静态没什么关系。 真的和动静态没有关系吗?似乎没有哪个静态语言的包管理会出现混乱的情况.从这点上至少说明静态语言的包管理要比动态语言容易些吧. |
|
返回顶楼 | |
发表时间:2006-11-13
cookoo 写道 这里的常客都知道我几乎不在java版发言,我的钻石都是在ruby版赚的。被你说成’一直支持java'实在有够郁闷。 既然你已经意识到这种X vs Y的讨论技术的因素是次要的何必还计较那些数字呢?呵呵,相信自己的感觉吧。 抱歉,我是说“你认为,我是作为一个 java的支持者 而提出这样的问题”。 |
|
返回顶楼 | |
发表时间:2006-11-13
floating 写道 cookoo 写道 至于第三方库,你说的冲突和命名域有关,和动静态没什么关系。
真的和动静态没有关系吗?似乎没有哪个静态语言的包管理会出现混乱的情况.从这点上至少说明静态语言的包管理要比动态语言容易些吧. 那DLL hell又是什么? |
|
返回顶楼 | |
发表时间:2006-11-13
floating 写道 cookoo 写道 至于第三方库,你说的冲突和命名域有关,和动静态没什么关系。
真的和动静态没有关系吗?似乎没有哪个静态语言的包管理会出现混乱的情况.从这点上至少说明静态语言的包管理要比动态语言容易些吧. C语言是静态语言,(尽管是弱类型的),可是连命名域的概念都没有,一冲突糊涂到底。可见动静态和LZ说的冲突没什么关系。 Expert C Programming Deep C Secrets是一本很优秀的书,作者Peter van der Linden是Sun的资深工程师,书里写了很多很有趣的小故事,其中一个就是讲C语言因为没有命名域而引起冲突的。(第五章第125页) 辛辛苦苦敲进来: 引用 An Interpositioning Bug in SunOS Under SunOS 4.0.3, the printing program /usr/ucb/lpr occasionally issued the error message "out of memory" and refused to print. The fault appeared randomly, and it was very hard to track down. Finally, it was traced to an unintended interpositioning bug. The programmer had implemented lpr with a routine, global by default, called mktemp(), which expected three arguments. Unknown to the programmer, that duplicated a name already present in the (pre-ANSI) C library, which did a similar job but only took one argument. Unfortunately, lpr also invoked the library routine getwd(), which expects to use the library version of mktemp. Instead, it was bound to lpr's version! Thus, when getwd() called mktemp, it put one argument on the stack, but the lpr version of mktemp retrieved three. Depending on the random values it found, lpr failed with the "out of memory" error. |
|
返回顶楼 | |
发表时间:2006-11-13
bigpanda 写道 C语言是静态语言,(尽管是弱类型的),可是连命名域的概念都没有,一冲突糊涂到底。可见动静态和LZ说的冲突没什么关系。
笔误,我说的C应该改成C++。平时说习惯了,因为很少接触不支持C++的C编译器。 |
|
返回顶楼 | |
发表时间:2006-11-13
类C语法绝对是高级语言世界的魔鬼.
描述性语言的语法根本不可能类C ruby灵动的语法足以成为扼杀自己的隐患 |
|
返回顶楼 | |