Scala的一些最佳实践

原文地址:http://my.oschina.net/jingxing05/blog/286927

应用层

  • 80/20原则:80%的代码是 纯函数,其余如处理IO,数据库,用户交互等方面的20%的代码也应该尽量轻量级
  • 培养面向表达式的编程思维,培养函数式编程思维
  • 用Actor模型实现并发功能
  • 将更多的 行为 从 类里 移到 更细粒度的 trait中

代码层

  • 坚持写纯函数
  • 习惯将函数作为变量和参数进行传递
  • 重点学习scala的集合类和其API
  • 尽量使用immutable代码,优先使用val和immutable集合
  • 使用Option/Some/None/  忘记 java null的概念
  • 使用 try/Success/Failure类
  • 使用一种TDD/BDD 测试工具如 ScalaTest 或 specs2
  • 使用SBT来构建项目
  • 编码时 打开一个Scala的REPL控制台,随时测试验证的你的想法

纯函数-没有副作用的代码段

  • 引用透明性:同样的输入参数,总是返回同样的结果!
  • 表达式的值没有依赖应用的某个 状态|值|IO,只依赖输入参数和计算算法
  • 无副作用:函数不应该带来对应用的某个 状态|值 的mutable
  • 不会对输入参数进行 改变 mutable
  • 不执行IO操作或者和用户进行交互

纯函数实例

  • 数学计算方法,如 + -  *
  • String的 split、length、to* 方法
  • immutable集合上的方法, 如map、drop、take、filter flatMap
  • 从HTML字符串中 抽取值的方法,模式匹配

非纯函数-带副作用的

  • getDayOfWeek    getHoure  getMinute
  • getRandomNumber
  • 读取用户输入的、或打印输出的  方法
  • 向存储器 读写 数据的 方法

java程序中一般很多:字段通常是 mutable的;类似set方法mutable了类内部的字段,而get方法则可能返回 可mutable的数据结构

分析java源码 然后慢慢重构为 scala化的 代码  善用 case class和 object单例对象

尽量使用immutable对象

尽量优先使用immutable集合和val 变量

private val varname = new MutableObject

如让外部有直接操作或改变内部对象的权利

面向表达式的编程Expression Oriented Programming

面向表达式的编程指每一语句都是一个表达式,有返回值,无副作用, 函数式编程语言都应该这样!

相对的statement编程是不返回数据,使用副作用!

scala中的if/else match/case  try/catch 都有返回值

优点:更易理解的代码;没副作用,更容易测试;与scala语法绑定;更适合多核计算机

使用match/case来模式匹配

使用场景:

  • try catch
  • 函数或方法的主体中
  • Option Some None 代码模式中
  • actor的receive中
  • 替代笨拙的 if else if else    switch/case
  • 模式匹配中 case class
  • 部分函数中

忘记java中null的概念禁止使用null

变量初始化用Option   参数使用Option

没有获取预期的结果时 返回Option|None而非null,

用try  success failure 范式来返回错误信息

函数或方法不要返回 null,返回Option或者 try替代

将第三方包返回的null转换为Option

从Option获取值

同时使用Option 和集合   map flatten flatMap  collect

Try/Success/Failure提供更好的处理方式:filter flatMap flatten foreach map    get  getOrElse orElse  toOption  recover recoverWith transform


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值