征服复杂性,Eckel关于Java和Python以及块理论

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的背景.这是我想知道的:

  1. 当埃克尔在征服复杂性时称Python为"更好"时,他究竟考虑了什么?他和其他人一起使用这两者的想法是什么?

  2. 您如何看待征服复杂性?Python的更短和更简洁的语法是一种克服复杂性的关键方法(因此,例如,Jython可能是Java优秀库的一个很好的桥梁,以及Python的简洁语法),或者是Java的强类型思维,从C++继承了这个想法,从Simula继承了这个想法,我认为它是征服复杂性的关键?或者它是Rapid Application Designer(想想Delphi,还是Java,优秀的免费NetBeans窗口/表单设计器工具)或组件,bean或J2EE?什么征服了所有人,对你而言?

这已经被标记为主观的.[编辑]

注意:更多关于布鲁斯的想法,关于他喜欢Python的原因可以在这里找到.文章的一个关键引用:

Bruce Eckel:他们说你可以在脑海中持有七个加减两个信息.我不记得如何用Java打开文件.我写过章节.我已经完成了很多次,但步骤太多了.当我真正分析它时,我意识到这些只是他们所做的愚蠢的设计决定.即使他们坚持在java.io中使用Decorator模式,他们也应该有一个方便的构造函数来简单地打开文件.因为我们一直打开文件,但没有人能记得如何.抱在脑海里的信息太多了.

所以,块理论.通过块理论度量,Python杀死了其他所有人.我会批他的.但您使用的指标是什么?我想特别邀请人们支持Java,如果你愿意的话,反对布鲁斯.

[请不要投票重新开放,这个主题本质上是煽动性的,而且我的失言已经让它更加如此.我同意主持人的意见.]

mer*_*ike 5

Bruce Eckel:他们说你可以在脑海中持有七个加减两个信息.我不记得如何用Java打开文件.

我可以:

new FileInputStream(filename);
Run Code Online (Sandbox Code Playgroud)

我写过章节.我已经完成了很多次,但步骤太多了.当我真正分析它时,我意识到这些只是他们所做的愚蠢的设计决定.即使他们坚持在java.io中使用Decorator模式,他们也应该有一个方便的构造函数来简单地打开文件.

通过用简单的api编写该实用方法,可以在几分钟内解决这个问题.它一直都是.如果这是针对Java的最强烈的批评,我仍然显然不为所动.

  • 当然,如果您打开文本文件,该代码将失败,在这种情况下您需要使用FileReader.除非你需要不同的编码,否则你需要一个用InputStreamReader包装的FileInputStream.当然,99%的情况下你可能真的需要BufferedReader或BufferedInputStream.当然,你可以编写一个实用工具方法来使它更容易,但这就是重点,不是吗?为什么开始这么复杂? (5认同)
  • 我相信Java中的静态类型是允许建立大教堂而不是集市帐篷的迫击炮.(请注意,建造大教堂通常需要更长的时间) (3认同)
  • 您不必编写该实用程序方法,因为其他人已经为您执行了此操作:http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readLines%28java .io.File,%20java.lang.String%29 (2认同)
  • 我们谈论的是编程语言.在_course_中,您可以编写一个实用工具方法来简化任务.Java和Python之间的区别在于,您使用Java. (2认同)

Dav*_*rby 5

我认为布鲁斯正在接受弗雷德布鲁克斯的暗示,后者在他的论文"无银子弹"中谈到了复杂性,并描述了两种类型.第一种类型是您试图解决的问题所固有的,他称之为基本复杂性,无论您使用何种语言,它都是相同的.第二个是我们使用的工具和语言所增加的复杂性 - 你必须考虑的所有东西都没有直接增加解决问题.通过这种方法,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中更简单,更简洁,更简单,但没有其他方式.如果有人能指出我,那么我很乐意看到它.