Loan(借款)模式

12-11-21 banq
ScalaKnol: Understanding Loan Pattern(Loan(借款)模式) | Knoldus 一文是针对函数编程FP提出的一个模式,

Loan Pattern是将资源借给函数,能够切断大的语句:

1.创建一个你使用的资源
2.将资源借给使用它的函数
3.函数将被传递给调用者。
4.资源将被销毁。、

下面是一段数据库连接的代码:

def doSqlCall = {
    var conn: Connection = null
    try {    
      val url = "jdbc:mysql://localhost:3306/"
      Class.forName("com.mysql.jdbc.Driver").newInstance()
      conn = DriverManager.getConnection(url + "vikas", "userName", "password")
      val stmt = conn.prepareStatement("insert into employee (id,age) values (?,?) ")
      stmt.setString(1, "1001")
      stmt.setInt(2, "21")
      stmt.executeUpdate
    } catch {
      case ex: Exception => {        
          println("Exception: " + ex.getMessage)              
        }  
    } finally {
      conn.close
    }    
  }

<p class="indent">


这段代码有FP的提高余地,下面这段代码可能经常需要反复调用且不易修改,和业务有关:

val stmt = conn.prepareStatement("insert into employee (id,age) values (?,?) ")
stmt.setString(1, "1001")
stmt.setInt(2, "21")
stmt.executeUpdate
<p class="indent">


将这段代码封装起来,不用考虑数据库资源的打开和释放:

def executeMySqlFunction(conn:Connection):Int = {
      val stmt = conn.prepareStatement("insert into employee (id,age) values (?,?) ")
      stmt.setString(1, "1001")
      stmt.setInt(2, "21")
      stmt.executeUpdate
}
<p class="indent">

这个方法是将连接作为参数,返回整数型,而参数连接是作为被借出的资源。

这样,一开始原始代码就可以变成如下:

def doLoanSqlCall(f:Connection=>Int) = {
    var conn: Connection = null
    try {    
      val url = "jdbc:mysql://localhost:3306/"
      Class.forName("com.mysql.jdbc.Driver").newInstance()
      conn = DriverManager.getConnection(url + "vikas", "userName", "password")
      
      f(conn)

    } catch {
      case ex: Exception => {        
          println("Exception: " + ex.getMessage)              
        }  
    } finally {
      conn.close
    }    
  }
<p class="indent">


这里定义doLoanSqlCall作为一个方法,将另外一个函数作为参数,这样, doLoanSqlCall 成为一个更高级别的函数,作为参数的函数则将负责获得一个连接,然后返回整数。
也就是:
def executeMySqlFunction(conn:Connection):Int

executeMySqlFunction并不用担心如何创建一个连接以及是否需要销毁,连接作为一个资源已经出借给其他方法去照顾管理了。

客户端调用就变成类似桥模式的一种组合:
doLoanSqlCall(executeMySqlFunction)

clonalman
2012-11-27 05:50
2012-11-21 15:54 "@banq"的内容
doLoanSqlCall(executeMySqlFunction) ...


很多静态语言的编译器都有这个特性了,未来的编程方式是趋同的

猜你喜欢