面向表达式编程之美

参考文献
《Scala in depth》 by Joshua D.Suereth
《Thinking in scala》 by Bruce Eckel & Dianne Marsh
场景
什么是面向表达式编程,面向表达式编程的优点
分析
   
   
   
   
  • 语句与表达式的概念与区别
为什么要纠结这个问题呢?答:为了更好地理解面向表达式编程。【Mr.Snail注:以下概念有点抽象,说了等于没说,但又不得不说 偷笑】大致可以从以下两方面考虑:
  1. 表达式返回一个值,而语句则没有返回值-存在是为了使用其副作用(side-effect)。
  2. 语句可以由表达式组成,表达式可以由语句组成;表达式可以用作语句,而语句不能用作表达式。
下面通过一个案例来加以说明(为了在语义上更好地说明语句与表达式的联系与区别而瞎编): 打印并输出某交易系统中的error日志.
-----------------------先定义几个可能用到的方法-------------------
//读取硬盘中日志文件的全部异常内容
     
     
     
     
def readFile(filePath:String):String=
{
...
文件信息
}
// 抽取日志文件中error级别的异常
       
       
       
       
def analynise(content:String):Unit=
{
...
分析文件内容
...
}
         
         
         
         
//将异常信息在打印机中打印出来
def printFile(content:String):Unit=
{
...
打印并输出文件
...
}
----------在一定的程序上下文(context)中,使用上面定义的方法-------------
{
...
var content = readFile(filePath) // 此时readFile这个函数就是一个表达式(当然它内部也可能由多个语句组成)- 返回日志文件中的所有内容,
...
readFile(filePath) // 此时readFile这个函数就被当做语句使用了,当然这么做没有意义,虽然可以。
...
val content = analynise(content )
...
printFile(content) // 此时 printFile这个函数就是一个语句-因为该方法没有返回值,当然它内部可能由多个表达式组成
...
// 可以这么写:val content = analynise(readFile(filePath)),但不能这样写,编译时会报错,应为printFile是语句没有返回值,而analynise方法需要接受 一个参数: // val content = analynise(readFile(filePath))
}
  • 优先使用面向表达式编程
面向表达式编程能使代码更精简,更优雅?请比较下文中实现同一功能的三个方法。不得不说scala就像一篇散文啊,读起来贼爽,而模式匹配与面向表达式的完美结合又使这篇散文有了诗歌的简洁之美!
/**
  * function: 面向表达式编程的简洁之美
  * 结果:
  * NetWork Exception!
  * File Not Found"
  * Unknown Exception
  */
object Assignment_Oriented_Programming
{
  def main(args: Array[String]): Unit =
  {
    println(createErrorMessage(1))
    println(createErrorMessageNicer(2))
    println(createErrorMessageBest(3))
  }

  /**
    * 具有浓厚 java Style的代码
    */
  def createErrorMessage(errorCode:Int):String=
  {
    var result:String = "" //定义了一个变量 var 存储result
      errorCode match
      {
        case 1 =>
          result = "NetWork Exception !" //每一个case中都给 result赋值
        case 2 =>
          result = "File Not Found Exception !"
        case _ =>
          result = "Unknown Exception !"
      }
    return  result // 最后通过关键字 return 申明方法返回结果
  }


  /**
    *  使用面向表达式的模式匹配加以优化
    */
  def createErrorMessageNicer(errorCode:Int):String=
  {
    val result = errorCode match { //定义一个常量 result,整个match语句构成一个表达式-返回具体的异常信息
      case 1 => "NetWork Exception"
      case 2 => "File Not Found"
      case _ => "Unknown Exception"
    }
    return result
  }


  /**
    * 最佳实践:地道 scala Style 的 代码
    */
  def createErrorMessageBest(errorCode:Int):String= errorCode match
  {
    case 1 => "NetWork Exception"
    case 2 => "File Not Found"
    case _ => "Unknown Exception"
  }
}
总结
表达式有返回值,语句没有返回值
优先使用面向表达式编程,让代码更简洁,高效

你可能感兴趣的:(面向表达式编程之美)