Loan(借款)模式

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
}
}

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


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

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


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
}

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

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


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
}
}

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

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

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

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

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