War*_* P 8 python java complexity-theory
他在1998年的Bruce Eckel的Thinking In Java简介中说:
编程是关于管理复杂性:您要解决的问题的复杂性,以及解决它的机器的复杂性.由于这种复杂性,我们的大多数编程项目都失败了.然而,在我所知道的所有编程语言中,他们都没有全力以赴,并决定他们的主要设计目标是克服开发和维护程序的复杂性.
在第二版和后一版中,他添加了这个脚注(大约2003年):
我在第二版中回过头来看:我相信Python语言最接近完全正是如此.见www.Python.org.
我是java的dabbler,有Delphi(Pascal),C,C++和Python的背景.这是我想知道的:
当埃克尔在征服复杂性时称Python为"更好"时,他究竟考虑了什么?他和其他人一起使用这两者的想法是什么?
您如何看待征服复杂性?Python的更短和更简洁的语法是一种克服复杂性的关键方法(因此,例如,Jython可能是Java优秀库的一个很好的桥梁,以及Python的简洁语法),或者是Java的强类型思维,从C++继承了这个想法,从Simula继承了这个想法,我认为它是征服复杂性的关键?或者它是Rapid Application Designer(想想Delphi,还是Java,优秀的免费NetBeans窗口/表单设计器工具)或组件,bean或J2EE?什么征服了所有人,对你而言?
这已经被标记为主观的.[编辑]
注意:更多关于布鲁斯的想法,关于他喜欢Python的原因可以在这里找到.文章的一个关键引用:
Bruce Eckel:他们说你可以在脑海中持有七个加减两个信息.我不记得如何用Java打开文件.我写过章节.我已经完成了很多次,但步骤太多了.当我真正分析它时,我意识到这些只是他们所做的愚蠢的设计决定.即使他们坚持在java.io中使用Decorator模式,他们也应该有一个方便的构造函数来简单地打开文件.因为我们一直打开文件,但没有人能记得如何.抱在脑海里的信息太多了.
所以,块理论.通过块理论度量,Python杀死了其他所有人.我会批他的.但您使用的指标是什么?我想特别邀请人们支持Java,如果你愿意的话,反对布鲁斯.
[请不要投票重新开放,这个主题本质上是煽动性的,而且我的失言已经让它更加如此.我同意主持人的意见.]
Bruce Eckel:他们说你可以在脑海中持有七个加减两个信息.我不记得如何用Java打开文件.
我可以:
new FileInputStream(filename);
Run Code Online (Sandbox Code Playgroud)
我写过章节.我已经完成了很多次,但步骤太多了.当我真正分析它时,我意识到这些只是他们所做的愚蠢的设计决定.即使他们坚持在java.io中使用Decorator模式,他们也应该有一个方便的构造函数来简单地打开文件.
通过用简单的api编写该实用方法,可以在几分钟内解决这个问题.它一直都是.如果这是针对Java的最强烈的批评,我仍然显然不为所动.
我认为布鲁斯正在接受弗雷德布鲁克斯的暗示,后者在他的论文"无银子弹"中谈到了复杂性,并描述了两种类型.第一种类型是您试图解决的问题所固有的,他称之为基本复杂性,无论您使用何种语言,它都是相同的.第二个是我们使用的工具和语言所增加的复杂性 - 你必须考虑的所有东西都没有直接增加解决问题.通过这种方法,Java比Python复杂得多.最简单的例子是规范的Hello World程序.在Python(以及其他几种语言)中,它是一行:
print "hello World!"
Run Code Online (Sandbox Code Playgroud)
在Java中它是
class HelloWorld {
static public void main( String args[] ) {
System.out.println( "Hello World!" );
}
}
Run Code Online (Sandbox Code Playgroud)
其中大部分与打印"Hello World"的任务无关,基本上是噪音.
与其他语言(如Python)相比,恕我直言增加了Java的复杂性有几个因素.
1)一切都必须在课堂上.这会强制您使用OO范例,即使它不合适,如上例所示,并添加许多不必要的boilplate类定义.
2)即使它强迫你使用类,它也不是完全面向对象的.我的意思是,并非所有东西都是对象,例如原始类型和方法.在python中,您可以子类化所有内置类型,并像其他任何对象一样传递函数和方法.
3)Java不起作用 - 实际上它不会阻止你使用功能范例.能够传递函数并创建闭包和lambda可以简化许多代码.Java中最接近的是使用匿名内部类来处理回调.
3)Java强制你在任何地方放入类型声明,这会在不添加有用信息的情况下增加大量的混乱.这不仅仅是静态与动态问题 - 像Scala这样的静态类型语言可以在90%的时间内推断出类型并消除所有噪音.
4)尽管Java强制您使用静态类型,但许多(可能是大多数)现实世界的Java程序在某些时候使用动态类型检查.每次从Object转换为特定类型时,您都在进行动态类型检查 - 在Java 5中添加泛型之前,这意味着每次使用容器类时都是如此.即使使用通用容器,它们的某些类型检查也是在运行时完成的.此外,每当你有一个带有类或方法名称的XML文件时,它们必须在代码中的某处进行动态类型检查,以确保它与真实类匹配.如此多的Java程序仍然存在动态类型的所谓"危险",但是Java的静态类型强迫您添加的所有详细程度.
我可以继续(并经常这样做),但我会停下来观察我已经看到很多代码在Python中比在Java中更简单,更简洁,更简单,但没有其他方式.如果有人能指出我,那么我很乐意看到它.
| 归档时间: |
|
| 查看次数: |
1189 次 |
| 最近记录: |