我是学生.我在第二年学习了java.现在我是第四年.我厌倦了java,我开始学习Scala.当我学习它时,我发现它非常复杂(尽管我喜欢它).我的问题可能适用于所有新的复杂语言.
为什么scala很复杂?
是因为我们需要创建复杂的软件吗?
或者我是唯一一个认为它很复杂的人?
cod*_*eon 37
@Anantha在过去的十年里,大多数大学一直在教他们的学生Java作为第一语言.我听说过很多案例,它甚至仍然是学生在大学时学习的唯一语言 - 除非他们自己拿起别的东西,就是这样.
纯粹从语言角度来看,Java的三个最具特色的特征是
功能1和2使其与Algol/C和C++系列中的各种语言非常相似.所有这些语言在其范例中都有相似之处,甚至使用完全相同的语言.
例如,C#尽管存在语法差异,但Windows作为主要目标操作系统和.NET框架作为"类库",很容易为Java程序员选择.这是因为两种语言共享相同的编程范例.
另一方面,Scala - 尽管在JVM上运行,提供与Java API的轻松互操作性 - 通常被称为多范式语言.该语言提供了函数式编程语言特性的深层语法集成,并以面向对象的方式构造代码.
函数式编程的概念 - 特别是一旦你进入琐碎的教程之外的代码 - 证明对于只有必要的OO语言经验的开发人员来说很难.我帮助开发人员快速掌握Scala等人的个人经验是,首先教他们Scheme很有帮助;)这是一个很好的,小巧,干净的Lisp方言.它有助于传达先进的功能概念.如果你决定试一试,我建议你看一下"The Little Schemer"和"The Seasoned Schemer".一旦你完成了这两本书,我敢打赌你会更容易看到Scala的语法并更清楚地看到它的概念.
简而言之:恕我直言,Scala并不难以学习,功能编程范例是大多数开发人员的原因,他们只是接触过命令式语言,难以加快速度.
Ita*_*man 13
这里有两个问题:
第一个问题更容易回答:Scala语言比Java更丰富.特别是,它的类型系统比Java更具表现力,这意味着可以将更多的逻辑错误表达为编译时错误.但是,为了利用这些功能,需要熟悉语言的不同构造(依赖类型,案例类,方差注释,视图等等).掌握这些需要时间,这就是为什么Scala比Java更复杂.
第二个问题比较棘手.Scala主张声称这些新结构使编写正确的程序变得更容易,并且生成的代码更简单.其他人则认为Scala的额外功能并不会超过理解其构造的语义的复杂性(例如,看一下这个话题.搜索"Scala").这是更广泛争议的表现:静态与动态类型语言的争议.
Scala很复杂,因为它为您提供了灵活性.一次又一次,没有足够的灵活性使得很难完成一些任务,但太多的灵活性就像太多的钱一样,它使你能够犯下真正的重大错误.
Scala既是面向对象又是功能.这两种语言类型曾经被认为是相当复杂的(尽管面向对象现在更加主流),但将它们放在一起会打开各种新的大门.其中一些门看起来像是"完成任务"的捷径!其中一些门后面有狮子.功能性编程为您提供了完成工作,挂起自己,并将您的社区联系起来多年的绳索.你可以不用功能性编程语言来伤害自己.
成功Scala的关键是要认识到你应该是一个成功的面向对象程序员,一个成功的函数式程序员,然后学习如何将两者结合在一起,以达到你的目标.这是很多工作.也许在未来,人们会知道学习Scala的"最佳"方法是什么,但就目前而言,已知的唯一方法是在两种不同的编程方法中做得很好,并且善于将它们混合在一起.
如果您认为语言很复杂,那么您可以考虑分阶段学习.
将Scala分解为不同部分的指南是许多人本能地和通常必然会做的,但本指南是由Martin(Scala的创建者)编写的,因此它具有独特的视角. http://www.scala-lang.org/node/8610
请注意,大多数让人失望的结构都在图书馆设计师级别中.中间应用程序开发人员可以在没有太多CS grad-school概念的情况下完成大量工作.
**
Level A1: Beginning application programmer
Java-like statements and expressions: standard operators,
method calls, conditionals, loops, try/catch
class, object, def, val, var, import, package
Infix notation for method calls
Simple closures
Collections with map, filter, etc
for-expressions
Level A2: Intermediate application programmer
Pattern matching
Trait composition
Recursion, in particular tail recursion
XML literals
Level A3: Expert application programmer
Folds, i.e. methods such as foldLeft, foldRight
Streams and other lazy data structures
Actors
Combinator parsers
Level L1: Junior library designer
Type parameters
Traits
Lazy vals
Control abstraction, currying
By-name parameters
Level L2: Senior library designer
Variance annotations
Existential types (e.g., to interface with Java wildcards)
Self type annotations and the cake pattern for dependency injection
Structural types (aka static duck typing)
Defining map/flatmap/withFilter for new kinds of for-expressions
Extractors
Level L3: Expert library designer
Early initializers
Abstract types
Implicit definitions
Higher-kinded types
**
Run Code Online (Sandbox Code Playgroud)
Scala的复杂之处在于类型系统.它非常灵活,但不幸的是在复杂类型签名中暴露了这种灵活性.
或者你可能正在发现使用更高阶函数复杂的范式转换.
无论哪种方式,我建议你坚持下去.它提供了一种超越Java语言的能力,这种语言无法传递.
我是唯一一个不认为它很复杂的人吗?你可以用它来编写复杂的东西.但替代方案是无法编写复杂的东西,这不完全是一种改进.但我发现语言本身很简单.
我认为你正在经历的是学习第二语言的震撼.您可能会发现C指针算术非常复杂.
我建议你不要把Scala看作复杂的,只是先进的.Scala代表了传统命令式编程语言的各个方面的广泛且令人惊讶的连贯性进展,但是这些进步中的每一个都很容易被吸收和应用.试图同时采用太多Scala的改进可能会导致混乱和信心受损.
斯卡拉值得主流采用,但似乎受到它自身的醉人效应的影响.在如此丰富的环境中尝试满足于应用小改进是非常困难的,但不要被推迟.
Scala很复杂有几个原因:
它带来了函数式编程范例.由于这些原因,Scala Collection库远远超过了Java.
它允许创建模块化和流畅的API.例如,在Scala中,方法#map是在TraversableLike(集合库中的一个根类)中实现的,其结果类型是最合适的具体集合的类型(对于BitSet,它将返回一个BitSet,如果映射将Int转换为Int,否则转换为Set.这是通过语言而不是编译器技巧实现的.
它是静态类型的.创建具有上述功能的动态语言更容易,但静态类型为您提供IDE支持和性能.
恕我直言,所有这些功能都非常重要,值得额外的复杂性.
我曾经和你在一起.当我在2006年遇到Scala时,由于其复杂性,我在尝试学习它之后放弃了它.我必须为我正在做的项目学习它,我很高兴我这样做了.我认为2006年没有学到它是我职业生涯中最大的错误之一.
| 归档时间: |
|
| 查看次数: |
16329 次 |
| 最近记录: |