Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns Scala编程器-“;是否应该有一个明显的方法来做到这一点;或;不止一种方法可以做到这一点;?_Design Patterns_Scala_Functional Programming - Fatal编程技术网

Design patterns Scala编程器-“;是否应该有一个明显的方法来做到这一点;或;不止一种方法可以做到这一点;?

Design patterns Scala编程器-“;是否应该有一个明显的方法来做到这一点;或;不止一种方法可以做到这一点;?,design-patterns,scala,functional-programming,Design Patterns,Scala,Functional Programming,我已经做Java很长时间了,大约6个月前开始使用Scala。我喜欢这种语言。我发现有一件事是做事情有多种方法。我不知道这是因为语言的本质,还是因为它还很年轻,还在不断发展,习语和最佳实践还没有出现 令我惊讶的是,我一直是python胜过perl的人,其中: “应该有一种——最好只有一种——显而易见的方法来做到这一点。” 对我来说比 “有不止一种方法可以做到这一点” 我很想知道你认为Scala适合这个比例,为什么 引用:而且整个概念是如此模糊以至于几乎毫无意义。但我怀疑,如果你使用的是一种真正只

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

令我惊讶的是,我一直是python胜过perl的人,其中:

“应该有一种——最好只有一种——显而易见的方法来做到这一点。”

对我来说比

“有不止一种方法可以做到这一点”

我很想知道你认为Scala适合这个比例,为什么



引用:而且整个概念是如此模糊以至于几乎毫无意义。但我怀疑,如果你使用的是一种真正只有一种方法可以做任何事情的语言,那么你至少有50%的时间会哭哭啼啼、咬牙切齿


我(模糊不清)的感觉是,在任何一种像样的通用编程语言中,完成大多数事情的方法总是很多的。

免责声明:我不知道Scala的作者是怎么想的,我只是作为一名Scala(以及python和ruby)开发人员表达我的观点

通过ScalaAPI,您看不到很多做同样事情的方法。例如,对象的可变版本和不可变版本具有相同的接口。这样的事情给了Scala一些连贯性

作为一种混合语言,通常有两种解决问题的方法:函数式和过程式(foreach vs for)。当然,如果您想使用过程化的方式,您只需要使用Java

如果您看一看像Lisp和Haskell这样的函数式语言,对于您采用的每种方法,通常都有一种方法可以做到这一点(因为您可以解决递归或列表理解中的问题)

最后,我相信任何代码都应该是显而易见的。而且写起来很明显。您可以非常灵活(perl/ruby)或严格(python)。Scala很灵活(想想在方法调用中使用“.”和括号的语法,但是你可以让它严格到你想要的程度。就个人而言,我喜欢严格的东西,所以我会编写自己的代码,我认为这是显而易见的方式。

Scala是一个包含许多不同理念和设计方法的系统。这些包括

  • 面向对象
  • 函数式编程
  • 特定于Java的方法
  • 面向语言的编程(扩展语法、元编程)
这允许程序员从许多不同的角度解决问题,因此可以通过多种方式解决问题。正如您所怀疑的,这正是语言的本质(就像其他通用/多范式语言一样)

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

    斯卡拉毕竟是一种功能性语言,因此我认为遵循一种功能性的编程风格是一种很好的实践(这也会导致非常简洁和优雅的解决方案)

  • 保持一致性!毕竟,你应该有一种方法,但你可以选择哪一种方法。避免混合副作用和纯函数,列出理解和库函数(映射、筛选),或Java与函数思维。相反,在最适合的地方正交使用不同的范式

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


我对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
还有一些不太通用的函数构造,它们是为这类问题设计的(因为它经常出现),如果您想要干净、紧凑的代码,这是“最好的”:

Array(1,2,3,4,5).reduceLeft( _ + _ )
有时也有一些非常非常规的构造可以完全满足您的需要;例如,在Scala 2.8中:

Array(1,2,3,4,5).sum

因此,您可以在总体性能、紧凑性、清晰性和速度方面进行权衡,从而得到一系列选择。如果您可以假设代码只需要对非常熟悉Scala的人进行访问,并且您知道是否需要绝对最佳的性能,那么好的选择通常是有限的。但是,由于由于语言和库的表达能力,通常有许多可能的、甚至是次优的方法来做事情。

scala提供了完全不同的方法来实现同样的事情,最明显的地方是在理解方面的

val ls = List(1, 2, 3, 4)
for (l <- ls) println(l) //for comprehension
ls.foreach(println(_))   //underlying form 
for
表单中,我可以看到这些更简单、更直观。值得一提的是,我重视选择你的风格的能力,因为不同背景的人喜欢不同的东西

在2.8like中添加控件构造就是一个很好的例子:来自Java背景的我一开始并没有获得这些抽象背后的力量,但如果我从功能领域开始,那么我可能会马上理解

我在Scala中的主要问题是option类缺乏合理的谓词理解

opt.isEmptyOr( p ) //does not exist
opt.forall( p )
它们是等价的,我不喜欢这样一个事实,即从可读性来看,前者并不存在
for (i <- 1 to 10;
     j <- 1 to 20 if (j % 2 == 0)) ...
opt.isEmptyOr( p ) //does not exist
opt.forall( p )
opt.notEmptyAnd( p ) //does not exist       
opt.map(p).getOrElse(false)