huy*_*hjl 15 design-patterns functional-programming scala
我已经做了很长一段时间的Java并且大约6个月前开始使用Scala.我喜欢这门语言.我发现的一件事是有多种方法可以做.我不知道这是因为语言的性质还是因为它还很年轻而且不断发展,习惯用法和最佳实践还没有出现.
让我感到惊讶的是,我一直是perl人的蟒蛇,其中:
"应该有一个 - 最好只有一个 - 明显的做法."
对我来说比对我更有意义
"有不止一种方法可以做到这一点".
我很想知道你认为Scala适合这种规模的原因以及为什么?
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的人可以访问代码,并且你知道你是否需要绝对最佳的性能,那么好的选择通常是相当有限的.但是,由于语言和库的表达能力,通常有许多可能的次要方法来做事.
Scala是一种包含许多不同哲学和设计方法的多范式语言.这些包括
这允许程序员从许多不同的角度解决问题,因此在许多方面.正如您所怀疑的那样,这就是语言的本质(就像其他通用/多范式语言一样).
使用哪一个很大程度上取决于程序员,虽然我可以给出一些一般规则/想法:
毕竟,Scala是一种功能语言.因此,我认为遵循一种功能性的编程风格是一种很好的做法(这也将导致非常简洁和优雅的解决方案)
始终如一! 毕竟,应该有一种方式,但你可以选择哪一种方式.避免混合副作用和纯函数,列表推导和库函数(映射,过滤)或Java-与功能思维混合.相反,在他们最佳服务的地方正交使用不同的范例.
使用Scala为您提供的精彩功能(而不仅仅是将它用作具有良好语法的Java):模式匹配,延续,泛型和极其强大的类型系统,高阶函数.