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)