问题 你能否为Scala哲学和程序设计提出任何好的介绍?


在Java和C ++中,设计程序的对象层次结构非常明显。但是从Scala开始,我发现自己很难确定要定义什么类来更好地使用Scala的语法糖设施(甚至理想我应该如何设计以获得更好的性能)。关于这个问题有什么好的读数吗?


10232
2017-08-31 23:05


起源

我会说在Java或C ++中“显而易见”的任何类层次结构在Scala中应该同样如此。然而,这并不是它的符号问题,它与它们中的任何一个都没有根本不同。 - Randall Schulz


答案:


我已经阅读了4本关于Scala的书,但我还没有找到你要求的东西。我猜你已经读过Odersky(Artima)的“Scala编程”。如果没有,这是一个链接到在线版本:

http://www.docstoc.com/docs/8692868/Programming-In-Scala

本书提供了许多如何在Scala中构建面向对象模型的示例,但所有示例的类数都非常少。我不知道有任何书会教你如何使用Scala构建大规模系统。

  • 势在必行的面向对象 具有 自Smalltalk以来一直存在,所以我们 对这个范例了解很多。
  • 功能面向对象 在...上 另一方面,是一个相当新的概念, 所以几年后我会期待书籍 描述大规模FOO系统 出现。无论如何,我认为是PiS 书给你一个很好的图片 你怎么能把基本的拼凑起来 系统的构建块,如 工厂模式,如何更换 战略模式与功能 文字等。

Viktor Klang曾告诉我的一件事(以及我真正同意的一点)是C ++ / Java和Scala OO之间的一个区别是你在使用Scala时定义了更多(更小)的类。为什么?因为你能!的语法糖 case class 在键入和代码的可读性方面,定义一个类会导致非常小的惩罚。如您所知,许多小类通常意味着更好的OO(更少的错误)但性能更差。

我注意到的另一件事是,在处理不可变对象时,我更多地使用工厂模式,因为实例的所有“更改”都会导致创建新实例。感谢上帝 copy() 关于的方法 case class。这种方法使工厂方法缩短了很多。

我不知道这对你有什么帮助,但我认为这个主题非常有趣,而且我也在等待更多关于这个主题的文献。 干杯!


7
2017-09-01 07:57





这仍然是一个不断发展的问题。例如,刚刚发布的Scala 2.8.0获得了支持 类型构造函数推断,这启用了一种模式 类型类 在斯卡拉。 Scala库本身刚刚开始使用这种模式。就在昨天,我听说有一个新的Lift模块,他们将尝试避免继承而支持类型类。

Scala 2.8.0还引入了较低优先级的implicits,以及默认和命名参数,这两个参数可以单独使用或一起使用,以产生与以前不同的设计。

如果我们走了 时光倒流,我们注意到其他重要特征也不是那么老:

  • 抽出器  在2008年2月引入的案例类对象伴随的方法(在此之前,对案例类进行提取的唯一方法是通过模式匹配)。
  • 懒惰的价值观 和 结构类型 2007年7月推出。
  • 抽象类型 支持 类型构造函数 于2007年5月推出。
  • 提取 非案例类别于2007年1月推出。
  • 看起来 隐含参数 他们只是在2006年3月推出,当时他们取而代之 意见 实施了。

这意味着我们都在学习如何设计Scala软件。确保依赖于功能和面向对象范例的经过测试的设计,以了解Scala中的新功能如何在其他语言中使用,如Haskell和类型类或Python和默认(可选)和命名参数。

有些人不喜欢Scala的这个方面,有些人喜欢它。但其他语言也有同感。 C#正在添加与Scala一样快的功能。 Java速度较慢,但​​它也经历了变化。它在2004年添加了泛型,下一个版本应该带来一些更改,以更好地支持并发和并行编程。


4
2017-09-01 14:48



很高兴听到您对此事的看法,这真是一个令人兴奋的时刻!只有一件事让我担心,关于用类型替换继承的部分。通过使用继承作为构建Scala系统的“标准”方法,我们构建了当今程序员所熟知的模式。转向类型类会使从Java到Scala的步骤变得更难,或者? - olle kullberg
@olle继承是众所周知的并且被广泛滥用。不仅仅是我这样说 - 所有OO专家都对如何使用继承提出了强有力的建议。使用类型类与使用接口没有太大的不同,没有人对它们的问题最少。 - Daniel C. Sobral
你可能在OO滥用和所有方面都是正确的。但我不相信类型类不会为“斯卡拉太难”火上添加更多木材。 - olle kullberg


我认为没有太多的教程。我建议你继续使用你现在的方式,但要查看“惯用的”Scala代码,并在以下情况下特别注意:

  • 用例类或案例对象而不是枚举或“值对象”
  • 使用对象作为单身人士
  • 如果您需要“取决于上下文”或依赖注入式功能的行为,请使用含义
  • 在设计类型层次结构时,或者如果您可以将事物从具体类中分解出来,请尽可能使用特征
  • 细粒度的继承层次结构是可以的。请记住,您有模式匹配
  • 知道“皮条客我的图书馆”模式

并且询问您认为需要理解某一点的问题。 Scala社区非常友好和乐于助人。我建议使用Scala邮件列表,Scala IRC或scala-forum.org


1
2017-09-01 08:09





我只是不小心用Google搜索了 一个名为“ScalaStyleGuide.pdf”的文件。去读...


0
2017-09-04 00:24