`
jeff312
  • 浏览: 76207 次
  • 性别: Icon_minigender_1
  • 来自: 新加坡
社区版块
存档分类
最新评论

Scala 学习感想(持续更新)

    博客分类:
  • J2EE
阅读更多
有一点写一点,不成章法,没有顺序。

Traits 的意义:java class 可以通过实现数个接口来规范自己的行为,但是interface无法提供通用代码共享给所有实现它的class。这个事情本来可以由继承来做,但是一方面jvm不支持多继承,另一方面继承本身是个侵入性很强的关系,对象管理会遭遇很多麻烦。Traits巧妙解决了多继承的问题,同时还规避了很多不必要的复杂性(即使是支持多继承的C++,其实现复杂度也被建议能避免则避免)。

(6/4/2011)
----------------------------------------------------------------------

val 的好处:在许多java编程最佳实践中都有这样的原则,即尽量用final定义变量,考虑到潜在的并发问题,immutable的对象和变量始终都应该作为首选。但是程序中的变量何其多也,在java里这样做会使得代码过于繁冗(想像一下满目final的情形,会让人恶心到吐吧)。scala 使用了一个简短的 val,加上无需明示类型,省多少键盘啊,用mac的人有福了。

(7/4/2011)
----------------------------------------------------------------------

无比灵活的pattern match,核心其实是Companion Object(尽管不限于此),隐式的apply(构建) 与 unapply(解构) 方法,使得 matching 的语法特别简洁,高效:
case class C1(f1: Int, f2: String)
val c1 = C1(5, "Hello") //隐式调用apply()方法,构建对象实例
val result = c1 match {
  case C1(f2) => "returned: " + f2 //matching 的同时以unapply()解构,获得f2
  case _ => "No matched"
}
println(result)

短短一块代码,做了五件事:
1. 定义了C1这个简单结构类,case关键字让编译器自动为其实现了hashCode(), equals(), 和toString()三个方法(注:有点像java里的Serialized接口,但更方便)。同时,隐式地为C1定义了一个Companion Object。
2. 利用Companion Object 的apply()方法构建一个C1的对象实例c1(作用相当于java里的静态工厂,然而编码效率高了几百倍,定义一个静态工厂方法何其麻烦,考虑到并发安全又得添加一堆代码)。
3. 对c1进行类型检验,分支处理。
4. 类型检验的同时利用unapply()解构,立即就获得了属性f2的引用并加以处理。
5. match 本身提供返回值,不必像java需要在match块外定义变量以备存储返回值,将面向对象的“封装”概念发挥得淋漓尽致。

我相信,无论哪个java程序员都会被scala强烈吸引的(除非没听说过),因为它实在是保护了我们日益僵硬的手指和键盘这类公司财产:)。有很多动态语言甚至可以做到更加简洁的地步,但往往是以牺牲细节控制为代价的,编码的高效往往带来运行时的低性能。scala同时兼顾了细节性能控制和高效编码,真是个神奇的语言。

(11/4/2011)
----------------------------------------------------------------------

scala 语言本身的扩展性广阔无限,缘于其优秀的设计。scala 的方法名可以选用的范围比java宽得多了,配合调用方法可省略"."和"()" 的特性,一个方法的调用可以如下:
obj1 *-< obj2

用java的习惯应该写成下面这样:
obj1.*-<(obj2);

其中 *-< 是方法名,obj2是这个方法的唯一参数。当然java编译器不会允许方法起这种名字。
scala 的写法多么简洁,调用方法就像使用运算符一样简单,java里要做成这样得升级语言特性(还是静态加入,不可改),比如得从java8升级到java9,而在scala里你可以自己定义成千上万这种类似运算符的方法,甚至自建一个语言库。因此,scala 的语言可以通过类库来扩展,可能性几乎是无限的,比起傻傻地等待java6到java7的升级,这可不知道领先了多少年。

(11/4/2011)
----------------------------------------------------------------------

用了两天时间才把 FP 的章节看完。惯于在OO思想下编程的头脑,要一下子吃透 FP 还真不容易。平时其实也有写一些js,对于闭包之类的概念还是有些基础的,但从软件设计的角度来学习FP还是头一遭,curry函数很有趣也很实用,implicit又是一个增强代码复用的有力武器(只是debug起来有些风险)。学习FP后头脑一个最大的改变,是immutable开始深深影响我的每一个编程活动。JavaBean技术标准,首先规定bean的属性不能裸奔,外界对相应属性的访问必须通过方法,于是我们需要一大堆看到就想吐的getter和setter,无异于作茧自缚。当一个bean是immutable对象时,所有属性想裸奔就裸奔,反正是永不可改,无需任何不必要的担忧。scala能够这样做,根据教程作者的说法,是scala能够低成本地创建对象实例,因此无需考虑复用对象的状态,想要略作修改再拿来用,自己创建一个copy就行了。

(13/4/2011)
----------------------------------------------------------------------

多线程开发,Actor绝对是是个可爱至极的小东西。java的多线程编程涉及细节太多,什么同步锁啊,notify啊,本来很清晰的逻辑模型,被java乱七八糟地一搅合,面目全非,要从阅读代码上看出点什么逻辑变得极其困难。当然你可以说那是代码过于平铺,没有设计好,但是要设计好又得付出艰苦的脑力劳动 —— 说白了,java无所不能,只是代价太高。Actor的程序写起来就简洁、自然多了,actor之间互传消息,如同现实中的几个人协作一样自然,比小学生作文还好写。

(14/4/2011)
----------------------------------------------------------------------

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics