scala 笔记(1)

正如某文所说 scala 是一个 large language,学习起来其实很花时间的,前面 functional programming 告一段落,课程内容基本看完,剩下如何利用这个语言做一些事情就要靠一些积累了。作为 jvm 上的静态语言,很自然就会与 java 本身进行比较,前面一些地方我们大致了解了 scala 提供的各种语法糖,个人感觉正是这些东西使得语言变得复杂庞大了起来,从某种意义上来说,庞大的语言更难学,往往一件事情简单的语言就只有一种叙述方式,而复杂的语言就显得多样化。一次 team meeting 上组内一群人讨论 scala 的 adoption,其实用这个语言的人不多,但是感觉如果需要做 code review 的话,采用一个新语言还是代价很高的。

后面打算从 twitter 的 scala school 几篇文章开始,以及 Effective Scala(感觉跟 Effective Java 还是差距很大的),不知道 scala 的标准库有什么比较好的文献,但是 twitter 这方面应用似乎挺多的,还公布了不少 lib(见)。

书写格式

  • scala 通常是 2 空格缩进,这样程序显得比较紧凑。比较鼓励在局部变量用一些简短的命名,随着作用域变大也应该适当使用更加详细的命名,如类、trait 等使用 camel case,避免覆盖关键字,getter 不必使用 get,方法使用动词,如果作用对象是类名本身应该省略。
  • import 的时候避免相对 import(即先 import 个 package 然后通过 import 子路径 import package 或类)
  • 对简单的语句省略 {}
  • 在传递匿名函数的时候如果本身是个 pattern matching 可以进一步简化

类型与泛型

  • 函数返回类型在私有情况下可以省略,但是如果是 public 的一般建议写成比较明确的,这样便于用户理解,也比较容易加入更多的 mixin,维护 backward compatibility
  • 容器类的 variance 由 mutability 决定,immutable 一般是 covariant,而 mutable 是 non-variant 的
  • 使用 type 定义 typle alias,简化复杂的类型名,而如果类型本身简单易懂,应该避免使用
  • implicit 慎用

容器类

  • 分为 immutable 和 mutable 两类,大致的继承关系都是 Iterable 下面分 Seq、Set 和 Map,每个大类下面又分别有不同的实现
  • 尽量使用 immutable collection,如果要用 mutable 也尽量通过 import scala.collection.mutable 继而 mutable.Set 这种方式来引用对应的类以示区别
  • 尽量使用提供的 Seq/Set/Map 的构造函数,这样可以调用默认的 builder 将实现与接口分离开,Java 里面虽然有类似的想法,但是往往不得不通过一些 factory method 来做,一方面不是太方便,另一方面却不能直接用 interface 名来做,觉得有点局限;不过 scala 的 object/class 混用手法,看起文档真有点怪怪的
  • 尽量避免显式调用循环,而使用 higher-order function 来进行容器的处理
  • 注意 collection 的性能,可以参看这里
  • java 的容器和 scala 之间可以互相转换,通过 scala.collection.JavaConverters._ 里面的 asJava/asScala(没看懂咋 work 的…)

并行编程

  • 一个就是 actor model 了,这个后面还是要好好研究下
  • 一个是 future,听某个同事鼓吹过,需要跟 java 的比较下
  • 往往 immutable collection 在并行里面更不容易犯错,不过 ms 上次也玩了下 java 的 mutable 的 delay queue 什么的

控制结构

  • 多学会用递归的形式求解问题,记得 @tailrec
  • return 仍然可以用,但是尽量别用它表示返回值,而是表示一些提前终止的位置
  • 使用 for-expression 的时候一般是使用 higher-order function 表示比较罗嗦的地方,比如嵌套多层等,因为本质上 for 只是个 grammar sugar
  • 记得利用 require/assert 表示对应的语义。

——————
And these words of Esau her elder son were told to Rebekah: and she sent and called Jacob her younger son, and said unto him, Behold, thy brother Esau, as touching thee, doth comfort himself, purposing to kill thee.

Advertisements
scala 笔记(1)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s