Scala程序员 - "应该有一种明显的方法来实现它"或"不止一种方式"吗?

huy*_*hjl 15 design-patterns functional-programming scala

我已经做了很长一段时间的Java并且大约6个月前开始使用Scala.我喜欢这门语言.我发现的一件事是有多种方法可以做.我不知道这是因为语言的性质还是因为它还很年轻而且不断发展,习惯用法和最佳实践还没有出现.

让我感到惊讶的是,我一直是perl人的蟒蛇,其中:

"应该有一个 - 最好只有一个 - 明显的做法."

对我来说比对我更有意义

"有不止一种方法可以做到这一点".

我很想知道你认为Scala适合这种规模的原因以及为什么?


行情:Python PEP20Perl引用

Rex*_*err 19

我对Scala的经验是,有不止一种方法可以做事,但是做事情的方法相对较少.图书馆以不同方式做事的几乎没有任何选择; 当它这样做时,通常是在一部分案例中实现额外的表现力或紧凑性或效率.

例如,如果你想对一个整数数组求和,那么你可能完全是程序性的,这会产生尽可能快的代码,但代价是有点笨重 - 但如果这是真正的时间关键代码,这是解决问题的唯一最佳方法:

val array = Array(1,2,3,4,5)
var sum = 0
var index = 0
while (index < array.length) {
  sum += array(index)
  index += 1
}
sum
Run Code Online (Sandbox Code Playgroud)

使用基元时,同样通用的功能方法速度较慢(这可能会随着2.8中的@specialized而改变),但会让你减少乏味:

var sum = 0
Array(1,2,3,4,5).foreach(x => sum += x)
sum
Run Code Online (Sandbox Code Playgroud)

然后有一些稍微不那么通用的功能结构就是为这类问题设计的(因为它出现了很多),如果你想要干净,紧凑的代码,这是"最好的":

Array(1,2,3,4,5).reduceLeft( _ + _ )
Run Code Online (Sandbox Code Playgroud)

有时会有非常非常规的结构来完全按照你的意愿行事; 例如,在Scala 2.8中:

Array(1,2,3,4,5).sum
Run Code Online (Sandbox Code Playgroud)

因此,您可以在一般功率,紧凑性,清晰度和速度方面进行权衡,从而获得连续的选择.如果你可以假设只需要熟悉Scala的人可以访问代码,并且你知道你是否需要绝对最佳的性能,那么好的选择通常是相当有限的.但是,由于语言和库的表达能力,通常有许多可能的次要方法来做事.


Dar*_*rio 5

Scala是一种包含许多不同哲学和设计方法多范式语言.这些包括

  • 面向对象
  • 功能编程
  • 特定于Java的方法
  • 面向语言的编程(扩展语法,元编程)

这允许程序员从许多不同的角度解决问题,因此在许多方面.正如您所怀疑的那样,这就是语言的本质(就像其他通用/多范式语言一样).

使用哪一个很大程度上取决于程序员,虽然我可以给出一些一般规则/想法:

  • 毕竟,Scala是一种功能语言.因此,我认为遵循一种功能性的编程风格是一种很好的做法(这也将导致非常简洁和优雅的解决方案)

  • 始终如一! 毕竟,应该有一种方式,但你可以选择哪一种方式.避免混合副作用和纯函数,列表推导和库函数(映射,过滤)或Java-与功能思维混合.相反,在他们最佳服务的地方正交使用不同的范例.

  • 使用Scala为您提供的精彩功能(而不仅仅是将它用作具有良好语法的Java):模式匹配,延续,泛型和极其强大的类型系统,高阶函数.