代码之家  ›  专栏  ›  技术社区  ›  Warren P

克服复杂性,埃克尔谈Java和Python以及区块理论[结束]

  •  8
  • Warren P  · 技术社区  · 15 年前

    1998年,在介绍Bruce Eckel的Java思想时,他说:

    编程就是管理 复杂性:事物的复杂性 机器的复杂性 项目失败。然而,在所有的 决定他们的主要设计 发展与创新的复杂性 维护程序。

    在第二版和以后的版本中,他添加了以下脚注(大约2003年):

    在第二版中我又回到了这一点:我相信Python 没错。看到了吗www.Python.org.

    我是一个java的初学者,在Delphi(Pascal)、C、C++和Python中有背景。 我想知道的是:

    这已经是主观的了[[编辑]

    Note: More on Bruce's thoughts, on why he loves Python are found here. 文章中的一段关键引语:

    七加或减两块 你脑子里的信息。我不能 记住如何用Java打开文件。 我已经写了几章了。我已经做了 步骤。当我分析的时候, 我知道这些只是愚蠢的设计 他们所做的决定。即使他们 在java.io中,它们应该 有一个方便的构造器 简单地打开文件。因为我们打开了 所有的文件,但没有人可以 要记住的信息。

    所以,组块理论。根据组块理论,Python杀死了其他所有人。我会答应他的。但你用的标准是什么?如果你愿意的话,我想特别邀请大家支持Java,反对Bruce。

    5 回复  |  直到 15 年前
        1
  •  5
  •   Dave Kirby    14 年前

    我认为布鲁斯是从弗雷德·布鲁克斯那里得到启示的,他在他的文章《没有银弹》中谈到了复杂性,并描述了两种类型。第一种类型是你试图解决的问题所固有的,他称之为本质复杂性,无论你使用什么语言,它都是相同的。第二是我们使用的工具和语言增加了复杂性——所有你必须考虑的事情都不会直接增加问题的解决。以此衡量,Java比Python复杂得多。最简单的例子是规范的helloworld程序。在Python(和其他几种语言)中,只有一行:

    print "hello World!"
    

    在Java中就是这样

    class HelloWorld {
      static public void main( String args[] ) {
        System.out.println( "Hello World!" );
      }
    }
    

    其中大部分与打印“Hello World”的任务无关,基本上是噪音。

    与Python等其他语言相比,IMHO增加了Java的复杂性。

    2) 即使它迫使您使用类,它也不是完全面向对象的。我的意思是,不是所有的东西都是对象,比如原始类型和方法。在python中,可以对所有内置类型进行子类化,并传递函数&就像其他物体一样。

    3) Java不是功能性的——事实上,它千方百计阻止您使用功能性范式。能够传递函数并创建闭包和lambda可以简化许多代码。在Java中,最接近的方法是使用匿名内部类来处理回调之类的事情。

    3) Java迫使您在任何地方都放入类型声明,这会在不添加有用信息的情况下增加很多混乱。这不仅仅是一个静态与动态的问题——有一些静态类型的语言,比如Scala,可以90%的时间推断类型并消除所有的噪音。

    4) 尽管Java强制您使用静态类型,但许多(也许大多数)现实世界的Java程序在部分时间使用动态类型检查。每次您从一个对象转换到一个特定类型时,您都在进行动态类型检查——在Java5中添加泛型之前,这意味着每次您都要使用一个容器类。即使在使用泛型容器时,它们的一些类型检查也是在运行时完成的。而且,每当您有一个包含类或方法名的XML文件时,它就必须在代码的某个地方执行动态类型检查,以确保它与真正的类匹配。许多Java程序仍然存在所谓的动态类型化的“危险”,但是Java的静态类型化迫使您添加所有的冗长内容。

    我可以继续(而且经常这样做),但我将在这里停下来观察一下,我已经看到了许多在Python中比在Java中更简单、更干净、更不复杂的代码,但没有其他方法。如果有人能给我指一些,我很想看看。

        2
  •  5
  •   meriton    15 年前

    布鲁斯:他们说你能坚持住 你脑子里的信息。我不能

    我可以:

    new FileInputStream(filename);
    

    很多次了,但是太多了 步骤。当我分析的时候, 我知道这些只是愚蠢的设计 他们所做的决定。即使他们 在java.io中,它们应该 简单地打开文件。

    通过用一个简单的api编写实用方法,可以在几分钟内解决这个问题。 And it has been . 如果这是针对Java的最强烈的批评,那么我仍然毫无印象。

        3
  •  4
  •   Community CDub    8 年前

    然而,在我所知的所有编程语言中,没有一种语言能全力以赴,并决定他们的主要设计目标是克服开发和维护程序的复杂性。

    没有其他目标值得追求。汇编、C++、java、python和几乎所有其他现存的语言都是基于编程更容易的。

    Python无疑拥有任何语言中最直观的语法。它的块缩进的使用解决了很多问题,而且大部分是 close to plain language as you should get . M = [x for x in S if x % 2 == 0] 是一个很好的例子,看任何一本python的书都有很多。

    我相信 语法简单

    你所问的问题是语言理论的核心,它包含了可能会持续到时间尽头的战斗。 static vs dynamic typing 就是这样一场辩论。语言理论中还有许多其他的发展,比如过程语言、面向对象语言、函数语言和面向方面编程,它们试图简化编程。看看一种语言的最新(或任何)版本,看看正在做些什么来“克服复杂性”的例子。永远不会有一个明确的答案,对每一种方法的全面讨论都需要几个月的时间来阅读,到你完成时可能会完全改变D

        4
  •  3
  •   Chris B.    15 年前

    对我来说,从Java到Python的转换是一个巨大的胜利。我可以更快地编写代码,使用相同或更少的bug,并且更容易地修改代码。代码的可读性也要高得多,所以当我在几个月后回到代码中时,我可以更快地发现它在做什么(当我做不到的时候,重写它不会有太多麻烦)。

    int ,然后决定应该是 float ,则需要在整个程序中更改该类型。您是否将该值存储在数组中?您还需要更改该类型声明。决定重构几个类以共享一个公共接口?您必须在整个代码库中更改函数定义才能处理它。如果你有一个特别复杂的设计,你会发现你自己不得不处理很多这些问题。

    Python在语言中也有很多支持,可以改变某些事情的工作方式。例如,Python装饰器可以抽象出 许多

        5
  •  2
  •   Wayne Werner    15 年前

    上学期我的“面向对象Java”课程得了A,并且自学了几年的Python语言,加上对一般编程很感兴趣,并且用两种语言写了几行K(不包括注释),包括 Jack tooting my own horn 你可以自己决定;)

    例如,从命令行获取用户输入?

    Scanner input = new Scanner(new BufferedReader(System.in)); (我想?我才用了两三个月)

    蟒蛇是 raw_input() 而在3.0中,它只是简单的 input()

    如何从Java中读取文件?老实说,我不知道。我们没有做太多,而且比扫描仪还差。如前所述,Java的复杂性超过了我所知道的任何其他真正的语言,但并没有那么糟糕 that “语言。

    财富 Java用来构建API的工具和所述API的文档。我的意思是,您编写代码,输入一些特定的注释,然后(至少在Eclipse中)在菜单中选择一个项目,您就生成了一些注释 Java文档。尽管有这么好的文档是很好的,但我想知道它是否真的是出于需要而发展起来的,因为看一个程序会让你 没有线索 装配 没有Java那么麻烦。当然,比较几行代码确实是相当琐碎和毫无价值的,但关键是Java经常引入复杂性,而不是解决复杂性。

    我觉得Python有优势的最大原因是:有用的类型/功能是语言内置的,它们的名称往往非常好(至少如果它们不是超级好的名称,它们至少有一些提示)。

    例如,假设我想打开一个逗号分隔的文件(不使用额外的api或导入),并将每个元素存储在一个通用集合中。

    在Python(2.6+,或2.5)中,从 )实际上有两条线:

    with open('myfile.csv') as f:
        print f.read().split(',')
    

    在爪哇我不认为你 不导入外部类。当然,在现实中,我认为任何一种语言都只是倾向于偏好,可能是遗传或训练。

    有些人认为静态或动态类型引入的复杂性最小。我属于后一个阵营,但我理解这个论点。毕竟,如果你试图传递一个不同的类型,你的编译器会抱怨,而且你总是 知道

    但归根结底, golly 脚本。在Java类中编写代码时,我还能够理解其他一些东西 classes . 但是,我认为我在这个类中有很大的优势,因为Java概念是 类似于Python的概念。反之亦然,无论你喜欢哪种方式(或者它们都类似于Lisp概念;)

    老实说,我认为复杂性只是学习曲线。Python的学习曲线非常浅,幂是学习曲线的反函数。Java的学习曲线更陡,其功率曲线呈线性(2x?3x?)关系。一旦你学会了语言和基本概念,我想这两种语言的复杂性都会降到接近零。