Sin*_*nür 21
我认为你是本末倒置。首先要考虑的问题是您是否已经了解编程语言以及是否可以很好地编程。如果答案是肯定的,那么您可能已经在不知不觉中应用了一些面向对象的概念。
因此,您的首要任务是了解面向对象编程的含义,阅读封装、多态性、继承与组合等内容。一旦您熟悉了这些概念,您就可以适应您选择的语言所促进的任何范例。
仅仅因为 Java 强制您将几乎所有东西都视为对象,并不意味着所有 Java 程序都自动成为面向对象编程的好例子。
同样,仅仅因为 Perl 允许您做疯狂的事情,并不意味着您不能应用面向对象编程的原则。
对于 Perl,Moose提供了强大的功能。一旦掌握了基础知识,您应该阅读Moose::Manual::Unsweetened来简要概述普通 Perl 中的面向对象编程和 Moose 提供的糖。
tch*_*ist 19
Java 和 Perl 各自提出的面向对象模型各自提供了独特的优点,但也有不同的陷阱。
\n\nJava 中的类型擦除可防止某些依赖于动态运行时类型的 OO 技术。
\n\n在 Java 泛型中混合使用会使声明比在 C 中更加混乱,并且您可能永远无法用它们做您想做的事情。在 Perl 中,泛型本身就是简单的。
\n\n普通的、非 Moosed Perl 可能会让初学者感到困惑,因为他们需要了解在哪里存储类和对象数据成员的状态的机制。
\n\n如果您想要对对象执行的操作符合 Java\xe2\x80\x99s 模型,那么使用 Java 应该没有问题。但如果没有\xe2\x80\x99t,你真的别无选择。对于某些事情,有痛苦的解决方法,但对于许多事情来说,没有解决方法,你必须学会不这样做。
\n\nPerl 的 OO 模型到目前为止要丰富得多,但这可能不是新手容易理解的细微差别。从委托到自动加载,再到热交换/猴子修补类\xe2\x80\x99 方法以及日志包装器等等,几乎没有什么是你做不到的从委派到自动加载,再到热交换/猴子修补类\xe2\x80\x99 方法(带有日志记录包装器)等等,使用 Perl\xe2\x80\x99s 对象系统\xe2\x80\x94 一种或另一种方式。
\n\n如果您想了解运算符重载的好处和陷阱,那么您必须选择 Perl,因为 Java 根本不支持它。
\n\n如果您想尝试不同的方法解析策略,那么 Java 中同样没有这种灵活性。
\n\n如果你想学习多重继承,Java 不是一个好的选择。特别是与不同的 MRO 结合使用时,Perl 为您提供了很多可以使用的功能。
\n\n虽然可以使用 Java\xe2\x80\x99s 类加载器来模拟 Perl\xe2\x80\x99s 方法生成的 AUTOLOAD 机制可以为您做的一些事情,但我\xe2\x80\x99s 从未听说过有人认真使用就是为了那个。
\n\n如果你想间接谈论类和方法,你确实需要比你一开始想象的更频繁地这样做,这在 Perl 中是完全简单的,你可以在任何你想放置变量的地方使用变量而不是文字。方法名称的类名。
\n\n相比之下,这需要在 Java 中使用其反射设施进行复杂且不直观的破解。
\n\n恕我直言,Java 中对于闭包没有好的解决方案,而 Perl 中的闭包又自然地遵循了语言的结构和机制。因此,如果您想在您的类中包含某些函数式编程技术,您将不得不在 Java 中逆流而上。
\n\nJava 中确实存在没有函数指针的解决方法,但这种对 \xe2\x80\x9cpatterns\xe2\x80\x9d 的依赖再次表明了对你不利的基本设计决策。有些人会称之为错误,但它们实际上是语言设计者建立的界限,即该语言使哪些类型的编程变得容易,哪些类型的编程变得非常棘手,以及哪些类型的编程变得不可能。如果您对一组边界比对另一组边界更满意,那么您的选择就很容易。但你需要了解它们。
\n\n\xe2\x80\x99 太糟糕了,你只有这两种编程语言可供选择。通过研究其他系统,您也可以学到很多东西,例如一方面是 Smalltalk(或者后来的 Eiffel),另一方面是 Go。如果只学习 Java 或 Perl,您可能会错过一些关键的简单性。
\n\n无论您研究哪种系统,您都面临着将 OO 与该特定语言\xe2\x80\x99s 设计所设置的界限等同起来的风险。这是非常不幸的,因为这些界限并不是坚实的现实,只是暂时的幻觉:因为还有其他面向对象的宇宙,其中不同的基本公理导致完全不同的编程方式。
\nAxe*_*man 12
在阅读这里的答案和评论之前,我毫不犹豫地接受了 Java 是 OO 编程的 Pascal/Basic,也是当前最流行、最畅销的语言之一。我对 Java 作为当前的语言并没有很大的反感。正如我上面所评论的,我是 Java 的早期采用者。如果您查看我的个人资料,我会将自己定位为“Java 和 Perl 程序员”,因为这就是我。
尽管我很喜欢 Perl,但我觉得没有必要回答并说“Perl!”。它可能不适合您的班级学习的语言。抛开我见过的一些看起来相当过程化的 Java 不谈,很难不用Java 编写面向对象的代码。OO 内置于语言中。这是一个很好的面向对象编程或学习面向对象的
Java 是安全的,而 Perl 则有点太容易被破解——一旦你在环境中注入了代码。有一些策略可以最小化这种风险,但是您在系统内部接受的代码仍然可以欺骗另一部分中接受的代码。
Java 是完全封装的(尽管你可能会因为不小心的设计而破坏它)。尽管 Perl 有Inside-Out 对象,这使得对象彼此不透明。它们从未超越 Perl OO 中普遍存在的“blessed hash”模型。由于它们只是哈希值,因此它们的所有“字段”都可供您使用(这使得一些自动化测试比 JUnit 更容易)。
Perl通过封装的方式解决了这个问题。我们 Perler 认为,您从一开始就不需要那么多的对象安全性,并且对象和子例程保持自己的双手通常就足够了。大多数动态语言都通过这种实践得到了进步,因为 Python、Ruby、JavaScript 都允许像 Perl 一样“深入”。
当你弄乱其他对象的内部数据时,迟早它会咬你一口。你会对它进行故障排除,并发现你应该尊重那些你没有完全拥有或探索其每一个含义的数据——我向你保证,如果你不留心古老的智慧,我的孩子,这种情况就会发生。
Perl 是一种多范式语言。这并不是唯一的。大多数动态语言也是如此:JavaScript、Python、Ruby……嗯,它们扩展到函数式编程,但没有那么多地扩展到声明式编程(如 Prolog)——尽管有相应的模块。( AI::Prolog,Language::Prolog::Types )。
但除此之外,Perl 在面向对象方面做得足够好。事实上,在简单的 OO 方案中,您可以在单个文件中声明所有类(但是不建议用于生产系统),可以轻松编写只需运行和测试的多态对象的简单示例。
这是 Java 不简单的地方之一:构建可执行文件。爪哇可以很简单——过去也很简单,但现在您需要执行一系列操作才能从一组源文件中获取可执行文件。
Perl 作为一种动态语言,(最好的情况)是可编写和运行的。
正如我在帖子下的评论中提到的,Perl 让您探索OO。它不仅仅是基于继承的多态性。Class::Delegator提供声明性委托语法。Moose提供角色、混合和切点。
你可以学习更多 OO,因为它为您提供了更多工具。
关于 Perl 的本质还有一件事。我在 Java 世界中看到的几乎所有真正巧妙的事情都是通过反射或动态代码生成和编译来完成的 - 甚至像 AspectJ - 破解编译器!爪哇主义者非常自豪地谈论他们的防弹语言,同时为了绕过爪哇的监狱围墙,他们常常无法抗拒Java语言的动态吸引力。Class.forName如果他们不通过反射重新布线,他们往往无法抗拒动态吸引力(如果找不到类,就会爆炸) 。
因此,如果您不了解 Java,也没有花时间阅读生产 Java 代码或了解该领域的实践,那么您可以在这里相信炒作。所有这些市场份额都是由 Java 的适应性建立起来的——它比 Perl 更安全、更简洁。
而且 C++/Java 风格的模板破坏了封装性,并且与 Perl 代码一样碍眼。
Perl 是一片神奇的土地,巫师可以在这里施放咒语、反咒语和反反咒语(...),以防止其他发行版的巫师搞砸他们的魔法。
我见过很多混乱的 Perl 和 Sorceror's Apprentice Perl 技巧,它们玷污了 Perl Ether。我见过 Perl,但程序员并不知道 Perl 可以进行 while 循环,更不用说转换了。
但话又说回来,我在 Java EJB if-else-try-catch-jungles 中见过的 1200 多行 Perl 子程序并不常见。(不存在可读性问题!)。因为 Perl 允许您用更少的行来表达您想要做的事情。所以 200 多个 if-jungle 替补取代了他们的位置——而且他们几乎同样可怕。
dao*_*oad 11
两者都尝试一下。使用会发出咔嗒声的那个。
Java 和 Perl 在哲学上是截然相反的。Java 是关于严格类型、严格结构和正交语言设计的。Perl 的特点是灵活性和表现力。Java 是一门小语言,有大量的库需要学习。Perl 是一门庞大的语言,您只需要学习一点就可以使用。
在 Java 中,OOP 系统已融入到该语言中,并且只有一种真正的做事方法。它充满了关于最佳实践和严格控制对象之间的信息流的想法。
在 Perl 中,您获得了构建对象所需的最低限度的设施(一种将变量绑定到代码集、继承系统和命名空间的方法)。有效使用这些设施取决于您。正是这种灵活性让 Moose 得以诞生。它还允许失败的(IMO)对由内而外的物体进行的实验。Damian Conway 的《Object Oriented Perl》一书详细介绍了使用该系统的不同方法。
无论使用哪种语言,您都可以学到很多东西并提高工作效率。两种语言都尝试一下,要么选择一种,要么同时用两种语言做作业。如果您选择一款,请选择适合的一款。
Mat*_*ley 10
爪哇。你正在学习 OOP,对吧?Java 中的 OOP 比 Perl 中的 OOP 简单得多。您会发现适用于 Java 的工具支持(例如 Eclipse)对于您找到 OOP 的方法非常有帮助。
我也编写 OO Perl,但它是一种更难掌握的语言,尤其是在刚开始时。此外,该工具支持并不像 Java 中那样有用。使用 Java 几年后回到 Perl - 并学习现代风格,正如您将在 chromatic 的Modern Perl中找到的那样。
我使用 Perl 已有近 20 年了,有很多很多次我选择 Perl 而不是 Java。但我建议,如果您有这些选择,那就学习 Java。它的类型比 Perl 更强,有助于培养良好的编码习惯。如果您正在上大学,Java 现在是 100 级和 200 级 CS 课程的首选语言,所以现在学习它会给您带来帮助。
Perl 很棒,但它就像瑞士军用的电锯。你可以用它做很多非常强大的事情,或者你可以尝试切断肢体。
如果您仅限于这两种语言,我会投票支持 Java,支持学习 OOP。
另一方面,理解 OOP 是关于概念,而不是任何特定的语言,所以如果你牢牢掌握了这些概念,你当然可以使用你想要的任何语言。但我认为 Java 服务器在这种情况下更好......