Scala的编程规范与最佳实践

应用层

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老马说编程

计算机程序的思维逻辑 (14) - 类的组合

上节我们通过类Point介绍了类的一些基本概念和语法,类Point中只有基本数据类型,但类中的成员变量的类型也可以是别的类,通过类的组合可以表达更为复杂的概念。...

24090
来自专栏java学习

Java每日一练(2017/7/25)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

29050
来自专栏Vamei实验室

Java基础04 封装与接口

总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型。对象可以有状态和动作,即数据成员和方法。 到现在为止,数据成员和方法都是同时开放...

24170
来自专栏微信公众号:Java团长

Java基础04 封装与接口

总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型。对象可以有状态和动作,即数据成员和方法。

19120
来自专栏大数据文摘

超8千Star,火遍Github的Python反直觉案例集!

Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。

12320
来自专栏阿凯的Excel

Python读书笔记21(函数与列表)

上期和大家分享了向函数传递列表,今天继续来聊聊通过函数对列表进行操作。 ? 这个函数功能实现了两个列表内容的互换。 假如我们有个成绩列表,将不及格的成绩赋值给新...

35850
来自专栏软件开发 -- 分享 互助 成长

函数指针

前言: 先看两个基础,函数指针和extern关键字,然后由一个具体的例子,具体使用下函数指针。 一、基础 函数指针:即指向函数的指针,本质还是一个指针。 函数指...

23160
来自专栏技术小黑屋

译文:理解Java中的弱引用

不久之前,我面试了一些求职Java高级开发工程师的应聘者。我常常会面试他们说,“你能给我介绍一些Java中得弱引用吗?”,如果面试者这样说,“嗯,是不是垃圾回收...

19820
来自专栏java学习

Java每日一练(2017/7/16)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Ajax知识点视频更新了!(回复【学习视频】获取下载链接) ●答案公布时间:为每期发布题目的第二天 ★【新...

34170
来自专栏前端知识分享

第169天:面向对象基础概念(有待完善)

函数——面向对象 函数——工具 对象——工具包(把类似的功能放在一起管理) 工具:函数——方法

12120

扫码关注云+社区

领取腾讯云代金券