18

自从开始使用 Smalltalk 以来,我已经成为一名 Java 程序员 10 多年了。我认为下一个主流语言很可能是在无处不在的 Java 虚拟机上运行的语言。我想利用 Scala(以及其他语言)具有的一些特性——case类层次结构、闭包、类型推断的语句,因为它可以让我编写更简洁明了(我希望)的代码。更接近 Smalltalk!

Java 中所有的第二天性:

  • 建筑与ant
  • 将应用程序/库部署到逻辑jars
  • 强大的 IDE 工具支持
  • 编写 GUI(或者通过某种远程处理让 Swing GUI 与它对话?)
  • 3rd 方库/框架
  • 配置(属性XMLSpring
  • 数据库驱动程序等

我担心玩一些宠物项目和实际在工作场所愤怒地使用它之间的区别有点太大了。

  1. 有没有人实现这个飞跃?
  2. 它值得吗?
  3. 你学到了什么?

(显然人们正在使用Scala——但是否有人正在构建实际的企业应用程序,为了更好的说法?)

4

8 回答 8

12

我在我们现有的 Java 基础设施上使用了 Scala 来查询和操作大型 xml 文档。使用标准 Java xml 库是不可能的,或者不那么容易。

我很想将它用于投资组合性能计算,但已经完成了 Java 版本。Scala 版本会更容易维护,因为更容易将公式直接转换为代码。

您可以潜入 Scala 的另一个领域是多线程。对此没有真正的经验,但在 Scala 中似乎更容易。

关键是,现在不要试图将其视为 Java 的替代品,而是在您可以在现有 Java 代码旁边利用它的地方使用它。

我将 Intellij 与 Scala 插件一起用作 IDE,但它还没有。它可以与 maven 插件和控制台结合使用。

我也是一名 Smalltalk 程序员,喜欢在 Scala 中使用代码块。与 Java 相比,代码更少,但仍不如 Smalltalk 代码可读性好。

顺便说一句,由于 Seaside 框架,smalltalk 社区再次增长,所以您可能想返回

我学到或更好地理解的事情:

  • 构造函数的使用
  • 不变的概念
  • 使用列表和递归
  • 一般的函数式编程

所以是的,我认为这是值得的。

于 2009-02-17T06:29:29.567 回答
6

Jonas Bonér:http: //jonasboner.com/2009/01/30/slides-pragmatic-real-world-scala.html

于 2009-02-17T02:02:13.080 回答
6

在我们上一个项目中,我基本上用 Scala 代码打了每个人的头,因为我厌倦了调试由于对 Hibernate + JBoss 缺乏了解而导致的相同问题。(真的很神奇。编写原始系统的开发人员仍然在那儿,仍然迷失在 Hibernate 细节中。)

我们所拥有的 -> 一个古怪的系统,主要由一堆无状态 EJB bean 与一些休眠代码和一些 SQL 组合在一起构建而成。(基本上,我们是一个 ASP。生产集群相当小 -> 只有大约 100 台机器。)

我所做的 -> 将各种基于 REST 的服务放在一起,我们在其中重新定义了一些服务器之间的 RPC。这使得一切都非常容易编码,此外,将公共 API 实现到一个不关注依赖关系的系统中。

到目前为止,我们已经开始在 JBoss 实例内外部署代码,没有任何实际问题。当您第一次尝试object在 Java 中使用 Scala 时,您可能会皱起鼻子。但除此之外,没有人真正注意到。

到目前为止,距离我们真正开始已经大约 5 个月了。我们已经进行了几次重大修改,随后落后了,但该系统的测试远比过去好得多。因此,虽然我们在真正学习系统时有一些不好的想法潜入其中,但我们现在已经能够将它们全部删除,并且非常接近生产部署。总而言之,我想说典型的家伙需要 2-3 个月才能停止像 Java 程序员那样编码,并“熟悉”大多数标准库。

编写 JDBC 代码而不是 ORM 系统基本上已经排除了我们几乎所有的性能问题。速度实际上要好得多,但这主要是因为我能够用更少的实际应用程序代码完成我想做的一切。

我正在使用的工具:

  1. Restlet:对这个框架非常满意。我们的 restlet 层是非常琐碎的代码。
  2. JDBC -> 注意:我们已经调整了 wiki 中的基本内容
  3. XML(很快,JSON)
  4. buildr,我不想转换的几个项目的专家(加上 Nexus 和 Hudson)。我正在试验 sbt,这对于 scala 项目来说已经非常好了。

我们在重用任何旧的 java 库方面绝对没有问题,但我们确实倾向于将它们包装在可扩展的层中。主要是为了写更少的代码。

到目前为止,我的图书馆模式中的皮条客是最重要的一种。“蛋糕”模式很好,但您必须控制实例化,这有时不是很有用。我也在混合环境中使用过 Guice,也不是很难。但我发现混合代码的用处远没有我最初想象的那么有用,尽管这可能是因为我要替换很多非常非常糟糕的 Java 代码。

我的编辑环境主要是 OS X 上的 TextMate,但我们部署在 Linux 服务器上。

PS 是的,我知道这大约是 4 个月大,但无论如何。这是相关的,尤其是现在我们有一些经验。

于 2009-06-05T21:03:45.693 回答
2

我已将 clojure 添加到开普勒任务科学运营中心使用的软件基础架构中。现在它可以进行交互式调试;运行 REPL,加载一些类并以特别的方式执行方法。

编辑:好的,所以“加载一些类并执行方法”是模糊的。例如,我们可以加载我们的 crud 类,然后执行将一种航天器时间转换为另一种航天器时间的方法。

用户=>(导入'(gov.nasa.kepler.hibernate.dr LogCrud))
user=> (def crud (new LogCrud))
#'用户/crud
user=> (def shortCadences (.longCadenceToShortCadence crud 0 2500))
user=> (prn shortCadences)
#>

可以调用其他方法将此时间转换为其他类型的时间格式,这些格式可能对调试有用。我们可以制作命令行工具来封装所有这些功能,但没有必要,因为一切都可以从 clojure 获得。

于 2009-02-16T23:44:08.853 回答
2

另请参阅:Scala 应用程序的真实示例?

于 2009-02-17T11:17:29.297 回答
2

我在相关链接上看到了这个,并认为我会插话,现在我们已经过了几年。

IDE 支持有了很大改进,IntelliJ 11 在这一点上对 Scala 有很好的支持。语法突出显示效果很好,尽管调试仍然有点烦人。

SBT 看起来正在迅速取代 maven 或 ant/ivy,谢天谢地,SBT 比 Maven 更容易使用,并且更适合 Scala。IntelliJ for one 也有一个 SBT 控制台,结合交互式调试确实可以使 Scala 中的调试非常快,但老实说,现在语法突出显示变得非常好,我发现我需要的调试量大大减少了。Scala 的流动性比 Java 好得多,而且似乎导致代码更不容易出错。

数据库交互似乎还有点悬而未决,但有一些框架还不错,可以让您以一种或另一种方式快速使用数据库。

此时第三方库和框架比比皆是,当然您仍然可以使用任何普通的旧 Java 第三方库。

在这一点上,我要问一个问题:为什么不将 Scala 或其他下一代 JVM 语言用于项目?虽然简单的答案是今天许多开发人员还没有准备好与 Scala 打交道,但老实说,他们需要让他们的集体头脑清醒并参与到游戏中,而强制使用它的公司将持续很长时间实现这一目标的方法(我们所有人有时都需要推动才能重新回到游戏中)。另外,如果你在做任何类型的“企业”或大批量开发,而你不了解函数式编程并且想不通,请帮我们大家一个忙,放下你的 IDE,或者上帝-禁止 vim,坚持脚本或寻找新的职业道路。

今天有许多知名公司在使用 Scala,其中最公开的可能是 Twitter。他们还为开源世界贡献了一些框架。

于 2011-12-31T15:01:28.353 回答
1

是的,人们正在使用 Scala(和 Clojure)构建实际的“企业”应用程序。去做就对了。

当然,人们也在使用 Smalltalk,所以如果你喜欢 Smalltalk,为什么不使用它呢?

于 2009-02-16T23:18:17.403 回答
0

我曾经在“审判愤怒”中使用它来加载几 GB 的数据(对于我们所做的工作来说,这是一个相当轻的工作量)。我希望它比 PyPy 具有更高的性能和更少的内存开销。它在内存使用上失败了。太糟糕了,我吓坏了,不好意思说出来,再也没有看它。

于 2013-05-20T19:33:05.263 回答